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.
Files changed (204) hide show
  1. package/CHANGELOG.md +770 -0
  2. package/LICENSE +21 -0
  3. package/README.md +295 -0
  4. package/alp.config.yaml +5 -0
  5. package/dist/src/agents/agent-definition.js +28 -0
  6. package/dist/src/agents/capability-catalog.js +33 -0
  7. package/dist/src/agents/compaction.js +36 -0
  8. package/dist/src/agents/errors.js +12 -0
  9. package/dist/src/agents/librarian.js +38 -0
  10. package/dist/src/agents/main.js +37 -0
  11. package/dist/src/agents/memory-grant.js +29 -0
  12. package/dist/src/agents/model-context.js +70 -0
  13. package/dist/src/agents/modes.js +134 -0
  14. package/dist/src/agents/oracle.js +36 -0
  15. package/dist/src/agents/read-thread.js +38 -0
  16. package/dist/src/agents/registry.js +238 -0
  17. package/dist/src/agents/render-identity.js +38 -0
  18. package/dist/src/agents/review.js +37 -0
  19. package/dist/src/agents/search.js +37 -0
  20. package/dist/src/agents/shared/house-rules.js +33 -0
  21. package/dist/src/agents/shared/principal.js +18 -0
  22. package/dist/src/agents/shared/voice.js +29 -0
  23. package/dist/src/agents/titling.js +32 -0
  24. package/dist/src/agents/types.js +15 -0
  25. package/dist/src/backend/execution-backend.js +2 -0
  26. package/dist/src/backend/local-execution-store.js +144 -0
  27. package/dist/src/backend/local-process-backend.js +533 -0
  28. package/dist/src/backend/local-supervisor.js +104 -0
  29. package/dist/src/cli/alp.js +380 -0
  30. package/dist/src/cli/commands/context.js +203 -0
  31. package/dist/src/cli/commands/delegate.js +136 -0
  32. package/dist/src/cli/commands/identity-sync.js +31 -0
  33. package/dist/src/cli/commands/init.js +184 -0
  34. package/dist/src/cli/commands/mode.js +22 -0
  35. package/dist/src/cli/commands/principal.js +114 -0
  36. package/dist/src/cli/commands/run-main.js +90 -0
  37. package/dist/src/cli/commands/runtime.js +21 -0
  38. package/dist/src/cli/mode-preference-store.js +62 -0
  39. package/dist/src/cli/mode-selector.js +178 -0
  40. package/dist/src/cli/update-check.js +77 -0
  41. package/dist/src/context/checkpoint.js +134 -0
  42. package/dist/src/context/compact-journal.js +153 -0
  43. package/dist/src/context/compact-payload.js +121 -0
  44. package/dist/src/context/continuity.js +70 -0
  45. package/dist/src/context/types.js +2 -0
  46. package/dist/src/delegation/backend-registry.js +40 -0
  47. package/dist/src/delegation/delegation-service.js +300 -0
  48. package/dist/src/delegation/types.js +12 -0
  49. package/dist/src/execution/execution-policy.js +96 -0
  50. package/dist/src/execution/execution-service.js +115 -0
  51. package/dist/src/execution/execution-store.js +78 -0
  52. package/dist/src/execution/identity-capsule.js +65 -0
  53. package/dist/src/execution/types.js +12 -0
  54. package/dist/src/hooks/execution-bridge.js +84 -0
  55. package/dist/src/index.js +4 -0
  56. package/dist/src/memory/adapters/markdown-file-store.js +257 -0
  57. package/dist/src/memory/adapters/memory-api-client.js +2 -0
  58. package/dist/src/memory/adapters/memory-path-mapper.js +76 -0
  59. package/dist/src/memory/adapters/remote-api-store.js +25 -0
  60. package/dist/src/memory/context-ranker.js +21 -0
  61. package/dist/src/memory/errors.js +58 -0
  62. package/dist/src/memory/memory-service.js +149 -0
  63. package/dist/src/memory/memory-store.js +2 -0
  64. package/dist/src/memory/types.js +2 -0
  65. package/dist/src/policy/capability-policy.js +29 -0
  66. package/dist/src/policy/delegation-policy.js +25 -0
  67. package/dist/src/policy/errors.js +10 -0
  68. package/dist/src/policy/invariants.js +31 -0
  69. package/dist/src/policy/memory-policy.js +22 -0
  70. package/dist/src/policy/policy-engine.js +85 -0
  71. package/dist/src/policy/types.js +8 -0
  72. package/dist/src/policy/workspace-policy.js +77 -0
  73. package/dist/src/principal/principal-profile-store.js +89 -0
  74. package/dist/src/runtime/adapter-files.js +147 -0
  75. package/dist/src/runtime/claude-adapter.js +177 -0
  76. package/dist/src/runtime/codex-adapter.js +169 -0
  77. package/dist/src/runtime/permission-rules.js +156 -0
  78. package/dist/src/runtime/render-session-context.js +124 -0
  79. package/dist/src/runtime/render-task-input.js +33 -0
  80. package/dist/src/runtime/runtime-adapter.js +2 -0
  81. package/dist/src/runtime/runtime-preference-store.js +66 -0
  82. package/dist/src/runtime/runtime-selector.js +178 -0
  83. package/dist/src/runtime/types.js +2 -0
  84. package/dist/src/runtime/windows-shim.js +57 -0
  85. package/dist/src/state-paths.js +49 -0
  86. package/dist/src/workflow/output-validator.js +27 -0
  87. package/dist/src/workflow/repair-policy.js +8 -0
  88. package/dist/src/workflow/types.js +22 -0
  89. package/dist/src/workflow/workflow-runner.js +81 -0
  90. package/hooks/compact-record.cjs +109 -0
  91. package/hooks/session-boot.cjs +112 -0
  92. package/hooks/session-end.cjs +34 -0
  93. package/package.json +48 -0
  94. package/scaffold/memory/INDEX.md +27 -0
  95. package/scaffold/memory/README.md +76 -0
  96. package/scaffold/memory/projects/INDEX.md +22 -0
  97. package/scaffold/memory/projects/PROTOCOL.md +128 -0
  98. package/scaffold/memory/projects/_template/PROJECT.md +45 -0
  99. package/scripts/alp.cjs +126 -0
  100. package/scripts/alp.ps1 +4 -0
  101. package/scripts/alp.sh +3 -0
  102. package/scripts/bootstrap.cjs +144 -0
  103. package/scripts/checkout-release.cjs +30 -0
  104. package/scripts/delegate.cjs +19 -0
  105. package/scripts/doctor.cjs +158 -0
  106. package/scripts/doctor.sh +3 -0
  107. package/scripts/ensure-state.cjs +22 -0
  108. package/scripts/lib/cli-link.cjs +375 -0
  109. package/scripts/lib/codex-role.cjs +18 -0
  110. package/scripts/lib/delegation/command-runner.cjs +108 -0
  111. package/scripts/lib/delegation/config.cjs +81 -0
  112. package/scripts/lib/install-paths.cjs +154 -0
  113. package/scripts/lib/release-manifest.cjs +42 -0
  114. package/scripts/lib/semver-lite.cjs +20 -0
  115. package/scripts/lib/state.cjs +274 -0
  116. package/scripts/lib/uninstall.cjs +252 -0
  117. package/scripts/lib/update-check-worker.cjs +21 -0
  118. package/scripts/lib/update.cjs +395 -0
  119. package/scripts/run-role.cjs +42 -0
  120. package/scripts/run-role.ps1 +4 -0
  121. package/scripts/run-role.sh +3 -0
  122. package/scripts/sync-project-index.sh +167 -0
  123. package/skills/agent-memory/SKILL.md +109 -0
  124. package/skills/alp-debug/SKILL.md +90 -0
  125. package/skills/alp-debug/references/defense-in-depth.md +118 -0
  126. package/skills/alp-debug/references/investigation-methodology.md +106 -0
  127. package/skills/alp-debug/references/log-and-ci-analysis.md +96 -0
  128. package/skills/alp-debug/references/performance-diagnostics.md +112 -0
  129. package/skills/alp-debug/references/reporting-standards.md +120 -0
  130. package/skills/alp-debug/references/root-cause-tracing.md +134 -0
  131. package/skills/alp-debug/references/systematic-debugging.md +93 -0
  132. package/skills/alp-debug/references/verification.md +86 -0
  133. package/skills/alp-debug/scripts/find-polluter.sh +63 -0
  134. package/skills/alp-debug/scripts/find-polluter.test.md +102 -0
  135. package/skills/alp-plan/SKILL.md +128 -0
  136. package/skills/alp-plan/references/archive-workflow.md +77 -0
  137. package/skills/alp-plan/references/codebase-understanding.md +55 -0
  138. package/skills/alp-plan/references/output-standards.md +96 -0
  139. package/skills/alp-plan/references/plan-organization.md +129 -0
  140. package/skills/alp-plan/references/red-team-personas.md +76 -0
  141. package/skills/alp-plan/references/red-team-workflow.md +81 -0
  142. package/skills/alp-plan/references/research-phase.md +57 -0
  143. package/skills/alp-plan/references/scope-challenge.md +82 -0
  144. package/skills/alp-plan/references/solution-design.md +76 -0
  145. package/skills/alp-plan/references/validate-question-framework.md +89 -0
  146. package/skills/alp-plan/references/validate-workflow.md +83 -0
  147. package/skills/alp-predict/SKILL.md +98 -0
  148. package/skills/alp-scenario/SKILL.md +86 -0
  149. package/skills/code-review/SKILL.md +111 -0
  150. package/skills/code-review/references/code-review-reception.md +114 -0
  151. package/skills/code-review/references/edge-case-scouting.md +78 -0
  152. package/skills/code-review/references/verification-before-completion.md +117 -0
  153. package/skills/delegation/SKILL.md +46 -0
  154. package/skills/docs-seeker/.env.example +15 -0
  155. package/skills/docs-seeker/SKILL.md +87 -0
  156. package/skills/docs-seeker/package.json +25 -0
  157. package/skills/docs-seeker/references/advanced.md +82 -0
  158. package/skills/docs-seeker/references/context7-patterns.md +68 -0
  159. package/skills/docs-seeker/references/errors.md +72 -0
  160. package/skills/docs-seeker/scripts/analyze-llms-txt.js +211 -0
  161. package/skills/docs-seeker/scripts/detect-topic.js +172 -0
  162. package/skills/docs-seeker/scripts/fetch-docs.js +213 -0
  163. package/skills/docs-seeker/scripts/tests/run-tests.js +72 -0
  164. package/skills/docs-seeker/scripts/tests/test-analyze-llms.js +119 -0
  165. package/skills/docs-seeker/scripts/tests/test-detect-topic.js +112 -0
  166. package/skills/docs-seeker/scripts/tests/test-fetch-docs.js +84 -0
  167. package/skills/docs-seeker/scripts/utils/env-loader.js +94 -0
  168. package/skills/docs-seeker/workflows/library-search.md +73 -0
  169. package/skills/docs-seeker/workflows/repo-analysis.md +90 -0
  170. package/skills/docs-seeker/workflows/topic-search.md +69 -0
  171. package/skills/git/SKILL.md +121 -0
  172. package/skills/git/references/branch-management.md +90 -0
  173. package/skills/git/references/commit-standards.md +82 -0
  174. package/skills/git/references/gh-cli-guide.md +132 -0
  175. package/skills/git/references/safety-protocols.md +86 -0
  176. package/skills/git/references/workflow-commit.md +89 -0
  177. package/skills/git/references/workflow-merge.md +63 -0
  178. package/skills/git/references/workflow-pr.md +70 -0
  179. package/skills/git/references/workflow-push.md +62 -0
  180. package/skills/gkg/SKILL.md +87 -0
  181. package/skills/gkg/references/cli-commands.md +92 -0
  182. package/skills/gkg/references/http-api.md +99 -0
  183. package/skills/gkg/references/language-support.md +54 -0
  184. package/skills/problem-solving/SKILL.md +86 -0
  185. package/skills/problem-solving/references/attribution.md +48 -0
  186. package/skills/problem-solving/references/collision-zone-thinking.md +71 -0
  187. package/skills/problem-solving/references/inversion-exercise.md +88 -0
  188. package/skills/problem-solving/references/meta-pattern-recognition.md +80 -0
  189. package/skills/problem-solving/references/scale-game.md +82 -0
  190. package/skills/problem-solving/references/simplification-cascades.md +83 -0
  191. package/skills/problem-solving/references/when-stuck.md +76 -0
  192. package/skills/repomix/SKILL.md +94 -0
  193. package/skills/repomix/references/configuration.md +134 -0
  194. package/skills/repomix/references/usage-patterns.md +106 -0
  195. package/skills/repomix/scripts/.coverage +0 -0
  196. package/skills/repomix/scripts/README.md +179 -0
  197. package/skills/repomix/scripts/repomix_batch.py +455 -0
  198. package/skills/repomix/scripts/repos.example.json +15 -0
  199. package/skills/repomix/scripts/requirements.txt +15 -0
  200. package/skills/repomix/scripts/tests/test_repomix_batch.py +531 -0
  201. package/skills/research/SKILL.md +107 -0
  202. package/skills/security-scan/SKILL.md +101 -0
  203. package/skills/security-scan/references/secret-patterns.md +75 -0
  204. 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 độ.