@huicai/cli 2026.712.80880 → 2026.721.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 (337) hide show
  1. package/README.md +2 -1
  2. package/bin/huicai.js +83 -0
  3. package/package.json +2 -2
  4. package/skills/ab-testing/SKILL.md +58 -0
  5. package/skills/ab-testing/scripts/__pycache__/ab_test.cpython-312.pyc +0 -0
  6. package/skills/ab-testing/scripts/ab_test.py +71 -0
  7. package/skills/academic-writing/SKILL.md +54 -0
  8. package/skills/accounting-ops/SKILL.md +68 -0
  9. package/skills/accounting-ops/scripts/__pycache__/acct_tools.cpython-312.pyc +0 -0
  10. package/skills/accounting-ops/scripts/acct_tools.py +89 -0
  11. package/skills/ai-agent/SKILL.md +85 -0
  12. package/skills/ai-agent/references/tool-design-checklist.md +51 -0
  13. package/skills/ai-aiops/SKILL.md +73 -0
  14. package/skills/ai-aiops/references/aiops-rollout-checklist.md +36 -0
  15. package/skills/ai-coding/SKILL.md +89 -0
  16. package/skills/ai-coding/references/task-brief-template.md +48 -0
  17. package/skills/ai-compliance/SKILL.md +74 -0
  18. package/skills/ai-compliance/references/genai-compliance-checklist.md +40 -0
  19. package/skills/ai-eval/SKILL.md +80 -0
  20. package/skills/ai-eval/scripts/eval-runner.py +150 -0
  21. package/skills/ai-llm-app/SKILL.md +90 -0
  22. package/skills/ai-llm-app/references/llm-integration-checklist.md +39 -0
  23. package/skills/ai-mlops/SKILL.md +72 -0
  24. package/skills/ai-mlops/scripts/token-cost-calc.py +108 -0
  25. package/skills/ai-multimodal/SKILL.md +86 -0
  26. package/skills/ai-multimodal/scripts/field-validate.py +182 -0
  27. package/skills/ai-prompt/SKILL.md +75 -0
  28. package/skills/ai-prompt/references/prompt-template.md +46 -0
  29. package/skills/ai-rag/SKILL.md +76 -0
  30. package/skills/ai-rag/scripts/chunk-inspect.py +129 -0
  31. package/skills/anomaly-detection/SKILL.md +54 -0
  32. package/skills/anomaly-detection/scripts/__pycache__/anomaly.cpython-312.pyc +0 -0
  33. package/skills/anomaly-detection/scripts/anomaly.py +99 -0
  34. package/skills/api-integration/SKILL.md +74 -0
  35. package/skills/api-integration/references/signing-recipes.md +141 -0
  36. package/skills/arch-design/SKILL.md +57 -0
  37. package/skills/arch-distributed/SKILL.md +81 -0
  38. package/skills/arch-distributed/references/idempotency-review.md +43 -0
  39. package/skills/arch-multitenant/SKILL.md +73 -0
  40. package/skills/arch-multitenant/references/tenant-isolation-checklist.md +34 -0
  41. package/skills/audit-assist/SKILL.md +63 -0
  42. package/skills/audit-assist/scripts/__pycache__/audit_sampling.cpython-312.pyc +0 -0
  43. package/skills/audit-assist/scripts/audit_sampling.py +93 -0
  44. package/skills/audit-chain/SKILL.md +60 -0
  45. package/skills/banking-credit/SKILL.md +59 -0
  46. package/skills/banking-credit/scripts/__pycache__/credit_metrics.cpython-312.pyc +0 -0
  47. package/skills/banking-credit/scripts/credit_metrics.py +53 -0
  48. package/skills/brand-design/SKILL.md +56 -0
  49. package/skills/business-plan/SKILL.md +56 -0
  50. package/skills/capital-ops/SKILL.md +52 -0
  51. package/skills/cicd-pipeline/SKILL.md +85 -0
  52. package/skills/cicd-pipeline/references/pipeline-review-checklist.md +39 -0
  53. package/skills/content-creation/SKILL.md +56 -0
  54. package/skills/corporate-governance/SKILL.md +56 -0
  55. package/skills/crawl-chain/SKILL.md +61 -0
  56. package/skills/customer-service/SKILL.md +51 -0
  57. package/skills/data-analysis/SKILL.md +46 -0
  58. package/skills/data-analysis/scripts/cjk_font.py +56 -0
  59. package/skills/data-chain/SKILL.md +54 -0
  60. package/skills/data-governance/SKILL.md +54 -0
  61. package/skills/data-report-pro/SKILL.md +65 -0
  62. package/skills/data-report-pro/scripts/__pycache__/bigdata.cpython-312.pyc +0 -0
  63. package/skills/data-report-pro/scripts/bigdata.py +79 -0
  64. package/skills/data-streaming/SKILL.md +87 -0
  65. package/skills/data-streaming/references/job-checklist.md +36 -0
  66. package/skills/data-wrangling/SKILL.md +52 -0
  67. package/skills/data-wrangling/scripts/__pycache__/join_tools.cpython-312.pyc +0 -0
  68. package/skills/data-wrangling/scripts/join_tools.py +99 -0
  69. package/skills/db-es/SKILL.md +68 -0
  70. package/skills/db-es/scripts/es-health.sh +72 -0
  71. package/skills/db-migration/SKILL.md +72 -0
  72. package/skills/db-migration/scripts/checksum-mysql.sql +46 -0
  73. package/skills/db-migration/scripts/checksum-postgres.sql +39 -0
  74. package/skills/db-migration/scripts/compare-reports.py +98 -0
  75. package/skills/db-mysql/SKILL.md +78 -0
  76. package/skills/db-mysql/scripts/mysql-health.sql +80 -0
  77. package/skills/db-postgres/SKILL.md +86 -0
  78. package/skills/db-postgres/scripts/pg-health.sql +67 -0
  79. package/skills/db-redis/SKILL.md +83 -0
  80. package/skills/db-redis/scripts/redis-health.sh +92 -0
  81. package/skills/dev-cpp/SKILL.md +94 -0
  82. package/skills/dev-cpp/references/cmake-sanitizer-snippets.md +56 -0
  83. package/skills/dev-cross-platform/SKILL.md +73 -0
  84. package/skills/dev-cross-platform/references/capability-matrix-template.md +39 -0
  85. package/skills/dev-csharp/SKILL.md +96 -0
  86. package/skills/dev-csharp/references/review-checklist.md +37 -0
  87. package/skills/dev-frontend/SKILL.md +91 -0
  88. package/skills/dev-frontend/scripts/bundle-budget.py +106 -0
  89. package/skills/dev-go/SKILL.md +88 -0
  90. package/skills/dev-go/scripts/go-triage.sh +54 -0
  91. package/skills/dev-harmony/SKILL.md +64 -0
  92. package/skills/dev-harmony/references/harmony-checklist.md +40 -0
  93. package/skills/dev-java/SKILL.md +77 -0
  94. package/skills/dev-java/scripts/jvm-triage.sh +84 -0
  95. package/skills/dev-mobile/SKILL.md +82 -0
  96. package/skills/dev-mobile/references/store-compliance-checklist.md +33 -0
  97. package/skills/dev-node/SKILL.md +82 -0
  98. package/skills/dev-node/scripts/node-triage.sh +78 -0
  99. package/skills/dev-php/SKILL.md +86 -0
  100. package/skills/dev-php/scripts/fpm-calc.py +48 -0
  101. package/skills/dev-python/SKILL.md +81 -0
  102. package/skills/dev-python/scripts/venv-doctor.sh +75 -0
  103. package/skills/dev-rust/SKILL.md +84 -0
  104. package/skills/dev-rust/references/cargo-ci-snippets.md +50 -0
  105. package/skills/dev-toolchain/SKILL.md +78 -0
  106. package/skills/dev-toolchain/scripts/secret-scan.sh +83 -0
  107. package/skills/doc-chain/SKILL.md +58 -0
  108. package/skills/doc-compare/SKILL.md +44 -0
  109. package/skills/doc-compare/scripts/compare.py +93 -0
  110. package/skills/docx-author/SKILL.md +39 -0
  111. package/skills/docx-author/scripts/docx_doc.py +161 -0
  112. package/skills/ecommerce-ops/SKILL.md +54 -0
  113. package/skills/ecommerce-ops/scripts/__pycache__/gmv_decompose.cpython-312.pyc +0 -0
  114. package/skills/ecommerce-ops/scripts/gmv_decompose.py +61 -0
  115. package/skills/education-training/SKILL.md +53 -0
  116. package/skills/ehs-safety/SKILL.md +63 -0
  117. package/skills/email-writing/SKILL.md +52 -0
  118. package/skills/eng-ai/SKILL.md +74 -0
  119. package/skills/eng-ai/references/ai-feature-checklist.md +36 -0
  120. package/skills/eng-architecture/SKILL.md +85 -0
  121. package/skills/eng-architecture/scripts/capacity-calc.py +100 -0
  122. package/skills/eng-automation/SKILL.md +84 -0
  123. package/skills/eng-automation/references/automation-inventory.md +38 -0
  124. package/skills/eng-automation/references/routine-presets.md +73 -0
  125. package/skills/eng-collaboration/SKILL.md +76 -0
  126. package/skills/eng-collaboration/references/collab-templates.md +43 -0
  127. package/skills/eng-complex-env/SKILL.md +84 -0
  128. package/skills/eng-complex-env/references/env-dossier-template.md +52 -0
  129. package/skills/eng-complex-env/scripts/env-recon.sh +152 -0
  130. package/skills/eng-data-platform/SKILL.md +81 -0
  131. package/skills/eng-data-platform/references/table-spec-template.md +39 -0
  132. package/skills/eng-database/SKILL.md +79 -0
  133. package/skills/eng-database/references/schema-review-checklist.md +37 -0
  134. package/skills/eng-develop/SKILL.md +76 -0
  135. package/skills/eng-develop/references/dod-checklist.md +43 -0
  136. package/skills/eng-docs/SKILL.md +71 -0
  137. package/skills/eng-docs/references/runbook-template.md +57 -0
  138. package/skills/eng-efficiency/SKILL.md +75 -0
  139. package/skills/eng-efficiency/scripts/dora-calc.py +104 -0
  140. package/skills/eng-infra/SKILL.md +81 -0
  141. package/skills/eng-infra/references/production-readiness.md +46 -0
  142. package/skills/eng-integration/SKILL.md +82 -0
  143. package/skills/eng-integration/references/integration-dossier-template.md +38 -0
  144. package/skills/eng-legacy/SKILL.md +81 -0
  145. package/skills/eng-legacy/references/modernization-workbook.md +46 -0
  146. package/skills/eng-observability/SKILL.md +78 -0
  147. package/skills/eng-observability/scripts/slo-calc.py +82 -0
  148. package/skills/eng-ops/SKILL.md +74 -0
  149. package/skills/eng-ops/references/postmortem-template.md +67 -0
  150. package/skills/eng-performance/SKILL.md +73 -0
  151. package/skills/eng-performance/scripts/perf-baseline.py +110 -0
  152. package/skills/eng-planning/SKILL.md +79 -0
  153. package/skills/eng-planning/scripts/schedule-calc.py +101 -0
  154. package/skills/eng-quality/SKILL.md +74 -0
  155. package/skills/eng-quality/references/test-plan-templates.md +46 -0
  156. package/skills/eng-release/SKILL.md +78 -0
  157. package/skills/eng-release/references/release-plan-template.md +36 -0
  158. package/skills/eng-reliability/SKILL.md +72 -0
  159. package/skills/eng-reliability/references/resilience-review.md +43 -0
  160. package/skills/eng-requirements/SKILL.md +86 -0
  161. package/skills/eng-requirements/references/story-templates.md +47 -0
  162. package/skills/eng-research/SKILL.md +73 -0
  163. package/skills/eng-research/references/research-templates.md +42 -0
  164. package/skills/eng-security/SKILL.md +73 -0
  165. package/skills/eng-security/references/security-review-checklist.md +33 -0
  166. package/skills/eng-ux/SKILL.md +85 -0
  167. package/skills/eng-ux/references/ux-review-checklist.md +36 -0
  168. package/skills/engineering-chain/SKILL.md +101 -0
  169. package/skills/engineering-chain/references/eng-health-review.md +37 -0
  170. package/skills/env-offline/SKILL.md +81 -0
  171. package/skills/env-offline/scripts/bundle-manifest.sh +94 -0
  172. package/skills/env-private-deploy/SKILL.md +72 -0
  173. package/skills/env-private-deploy/references/delivery-templates.md +35 -0
  174. package/skills/env-xinchuang/SKILL.md +73 -0
  175. package/skills/env-xinchuang/references/adaptation-matrix-template.md +41 -0
  176. package/skills/equipment-tpm/SKILL.md +56 -0
  177. package/skills/equipment-tpm/scripts/oee.py +58 -0
  178. package/skills/esg-report/SKILL.md +58 -0
  179. package/skills/esg-report/scripts/carbon_calc.py +61 -0
  180. package/skills/event-management/SKILL.md +51 -0
  181. package/skills/excel-analysis-chain/SKILL.md +73 -0
  182. package/skills/file-ingest/SKILL.md +51 -0
  183. package/skills/file-ingest/scripts/__pycache__/file_toolkit.cpython-312.pyc +0 -0
  184. package/skills/file-ingest/scripts/file_toolkit.py +404 -0
  185. package/skills/finance-analysis/SKILL.md +60 -0
  186. package/skills/finance-analysis/references/ratios.md +54 -0
  187. package/skills/finance-analysis/scripts/fin_ratios.py +132 -0
  188. package/skills/finance-chain/SKILL.md +59 -0
  189. package/skills/financial-modeling/SKILL.md +58 -0
  190. package/skills/financial-modeling/scripts/fin_model.py +123 -0
  191. package/skills/foreign-trade/SKILL.md +54 -0
  192. package/skills/funnel-cohort/SKILL.md +53 -0
  193. package/skills/funnel-cohort/scripts/__pycache__/funnel.cpython-312.pyc +0 -0
  194. package/skills/funnel-cohort/scripts/funnel.py +105 -0
  195. package/skills/gov-document/SKILL.md +57 -0
  196. package/skills/hr-chain/SKILL.md +51 -0
  197. package/skills/hr-operations/SKILL.md +53 -0
  198. package/skills/info-disclosure/SKILL.md +56 -0
  199. package/skills/infra-gateway/SKILL.md +85 -0
  200. package/skills/infra-gateway/references/golive-checklist.md +36 -0
  201. package/skills/infra-k8s/SKILL.md +78 -0
  202. package/skills/infra-k8s/scripts/k8s-triage.sh +84 -0
  203. package/skills/infra-mq/SKILL.md +87 -0
  204. package/skills/infra-mq/references/mq-review-checklist.md +36 -0
  205. package/skills/insurance-advisory/SKILL.md +57 -0
  206. package/skills/internal-audit/SKILL.md +66 -0
  207. package/skills/ip-management/SKILL.md +54 -0
  208. package/skills/ipo-listing/SKILL.md +60 -0
  209. package/skills/it-audit/SKILL.md +56 -0
  210. package/skills/itsm-ops/SKILL.md +55 -0
  211. package/skills/knowledge-sop/SKILL.md +51 -0
  212. package/skills/legal-chain/SKILL.md +55 -0
  213. package/skills/legal-contract/SKILL.md +58 -0
  214. package/skills/legal-contract/references/contract-checklists.md +59 -0
  215. package/skills/litigation-support/SKILL.md +53 -0
  216. package/skills/logistics-warehouse/SKILL.md +53 -0
  217. package/skills/logistics-warehouse/scripts/freight_check.py +71 -0
  218. package/skills/long-doc-analysis/SKILL.md +52 -0
  219. package/skills/management-accounting/SKILL.md +57 -0
  220. package/skills/management-accounting/scripts/__pycache__/costing.cpython-312.pyc +0 -0
  221. package/skills/management-accounting/scripts/costing.py +90 -0
  222. package/skills/manufacturing-chain/SKILL.md +57 -0
  223. package/skills/manufacturing-quality/SKILL.md +57 -0
  224. package/skills/manufacturing-quality/scripts/__pycache__/spc.cpython-312.pyc +0 -0
  225. package/skills/manufacturing-quality/scripts/spc.py +86 -0
  226. package/skills/marketing-analytics/SKILL.md +59 -0
  227. package/skills/marketing-analytics/scripts/__pycache__/rfm.cpython-312.pyc +0 -0
  228. package/skills/marketing-analytics/scripts/rfm.py +60 -0
  229. package/skills/marketing-chain/SKILL.md +57 -0
  230. package/skills/meeting-minutes/SKILL.md +55 -0
  231. package/skills/metrics-system/SKILL.md +55 -0
  232. package/skills/negotiation-prep/SKILL.md +56 -0
  233. package/skills/obs-prometheus/SKILL.md +74 -0
  234. package/skills/obs-prometheus/references/promql-cheatsheet.md +78 -0
  235. package/skills/office-automation/SKILL.md +54 -0
  236. package/skills/okr-review/SKILL.md +44 -0
  237. package/skills/ops-fleet/SKILL.md +69 -0
  238. package/skills/ops-fleet/scripts/batch-exec-guard.sh +119 -0
  239. package/skills/ops-linux/SKILL.md +69 -0
  240. package/skills/ops-linux/scripts/quick-triage.sh +138 -0
  241. package/skills/optimization-solver/SKILL.md +53 -0
  242. package/skills/optimization-solver/scripts/__pycache__/solver.cpython-312.pyc +0 -0
  243. package/skills/optimization-solver/scripts/solver.py +107 -0
  244. package/skills/pdf-toolkit/SKILL.md +43 -0
  245. package/skills/pdf-toolkit/scripts/pdf_ops.py +137 -0
  246. package/skills/pivot-crosstab/SKILL.md +44 -0
  247. package/skills/pivot-crosstab/scripts/__pycache__/pivot_tools.cpython-312.pyc +0 -0
  248. package/skills/pivot-crosstab/scripts/pivot_tools.py +90 -0
  249. package/skills/policy-analysis/SKILL.md +47 -0
  250. package/skills/portfolio-analysis/SKILL.md +56 -0
  251. package/skills/portfolio-analysis/scripts/__pycache__/portfolio.cpython-312.pyc +0 -0
  252. package/skills/portfolio-analysis/scripts/portfolio.py +78 -0
  253. package/skills/ppt-chain/SKILL.md +61 -0
  254. package/skills/pptx-author/SKILL.md +48 -0
  255. package/skills/pptx-author/scripts/pptx_deck.py +193 -0
  256. package/skills/pr-comms/SKILL.md +58 -0
  257. package/skills/pr-comms/references/pr-templates.md +54 -0
  258. package/skills/procurement-supply/SKILL.md +47 -0
  259. package/skills/procurement-supply/scripts/__pycache__/supply.cpython-312.pyc +0 -0
  260. package/skills/procurement-supply/scripts/supply.py +71 -0
  261. package/skills/product-design/SKILL.md +66 -0
  262. package/skills/product-design/references/prd-framework.md +60 -0
  263. package/skills/production-planning/SKILL.md +56 -0
  264. package/skills/production-planning/scripts/__pycache__/mrp_capacity.cpython-312.pyc +0 -0
  265. package/skills/production-planning/scripts/mrp_capacity.py +70 -0
  266. package/skills/project-management/SKILL.md +53 -0
  267. package/skills/project-management/scripts/__pycache__/cpm.cpython-312.pyc +0 -0
  268. package/skills/project-management/scripts/cpm.py +84 -0
  269. package/skills/project-proposal/SKILL.md +54 -0
  270. package/skills/project-proposal/scripts/budget_sheet.py +90 -0
  271. package/skills/qa-api-automation/SKILL.md +67 -0
  272. package/skills/qa-api-automation/references/three-layer-skeleton.md +61 -0
  273. package/skills/qa-mobile-automation/SKILL.md +70 -0
  274. package/skills/qa-mobile-automation/references/device-matrix-template.md +34 -0
  275. package/skills/qa-ui-automation/SKILL.md +80 -0
  276. package/skills/qa-ui-automation/references/stability-conventions.md +41 -0
  277. package/skills/quant-analysis/SKILL.md +60 -0
  278. package/skills/quant-analysis/scripts/__pycache__/quant.cpython-312.pyc +0 -0
  279. package/skills/quant-analysis/scripts/quant.py +102 -0
  280. package/skills/real-estate-property/SKILL.md +51 -0
  281. package/skills/real-estate-property/scripts/__pycache__/property_calc.cpython-312.pyc +0 -0
  282. package/skills/real-estate-property/scripts/property_calc.py +106 -0
  283. package/skills/regression-forecast/SKILL.md +52 -0
  284. package/skills/regression-forecast/scripts/__pycache__/regress.cpython-312.pyc +0 -0
  285. package/skills/regression-forecast/scripts/regress.py +106 -0
  286. package/skills/retail-store-ops/SKILL.md +57 -0
  287. package/skills/retail-store-ops/scripts/store_ops.py +57 -0
  288. package/skills/risk-compliance/SKILL.md +51 -0
  289. package/skills/sec-auth/SKILL.md +89 -0
  290. package/skills/sec-auth/references/auth-review-checklist.md +38 -0
  291. package/skills/sec-compliance/SKILL.md +74 -0
  292. package/skills/sec-compliance/references/dengbao-checklist.md +43 -0
  293. package/skills/securities-chain/SKILL.md +69 -0
  294. package/skills/securities-research/SKILL.md +58 -0
  295. package/skills/securities-research/scripts/__pycache__/valuation.cpython-312.pyc +0 -0
  296. package/skills/securities-research/scripts/valuation.py +93 -0
  297. package/skills/slides-html/SKILL.md +50 -0
  298. package/skills/slides-html/scripts/template.html +117 -0
  299. package/skills/statistical-testing/SKILL.md +51 -0
  300. package/skills/statistical-testing/scripts/__pycache__/stat_tests.cpython-312.pyc +0 -0
  301. package/skills/statistical-testing/scripts/stat_tests.py +131 -0
  302. package/skills/strategy-planning/SKILL.md +53 -0
  303. package/skills/supply-chain/SKILL.md +53 -0
  304. package/skills/tax-compliance/SKILL.md +57 -0
  305. package/skills/tax-compliance/scripts/tax_calc.py +90 -0
  306. package/skills/tech-research/SKILL.md +55 -0
  307. package/skills/tech-research/references/research-framework.md +50 -0
  308. package/skills/tender-bidding/SKILL.md +65 -0
  309. package/skills/tender-bidding/references/bid-checklist.md +44 -0
  310. package/skills/translation-pro/SKILL.md +44 -0
  311. package/skills/treasury-mgmt/SKILL.md +56 -0
  312. package/skills/treasury-mgmt/scripts/__pycache__/cashflow_forecast.cpython-312.pyc +0 -0
  313. package/skills/treasury-mgmt/scripts/cashflow_forecast.py +51 -0
  314. package/skills/web-scraping/SKILL.md +81 -0
  315. package/skills/web-search/SKILL.md +67 -0
  316. package/skills/xlsx-analysis/SKILL.md +96 -0
  317. package/skills/xlsx-analysis/scripts/__pycache__/xlsx_toolkit.cpython-312.pyc +0 -0
  318. package/skills/xlsx-analysis/scripts/xlsx_style.py +71 -0
  319. package/skills/xlsx-analysis/scripts/xlsx_toolkit.py +335 -0
  320. package/src/agent.js +1 -1
  321. package/src/api.js +1 -1
  322. package/src/codeindex.js +1 -1
  323. package/src/commands.js +1 -1
  324. package/src/config.js +1 -1
  325. package/src/context.js +1 -1
  326. package/src/device.js +1 -1
  327. package/src/doccache.js +1 -0
  328. package/src/doctor.js +1 -1
  329. package/src/executors.js +1 -1
  330. package/src/input.js +1 -1
  331. package/src/permissions.js +1 -1
  332. package/src/pyruntime.js +1 -0
  333. package/src/repl.js +1 -1
  334. package/src/scan.js +1 -1
  335. package/src/session.js +1 -1
  336. package/src/tools.js +1 -1
  337. package/src/tui/app.js +1 -1
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env python3
2
+ # SLO 错误预算计算器(eng-observability SLO/燃烧率纪律的可执行版)。python3 stdlib,零依赖。
3
+ # 用法:
4
+ # python3 slo-calc.py budget --slo 99.9 [--window-days 30]
5
+ # # SLO→允许的不可用时长与错误预算
6
+ # python3 slo-calc.py burn --slo 99.9 --total 2600000 --errors 4100 [--window-days 30 --elapsed-days 12]
7
+ # # 已消耗预算/燃烧率/按当前速度何时烧尽
8
+ # python3 slo-calc.py alert --slo 99.9
9
+ # # 双窗口燃烧率告警阈值建议(1h 急/6h 缓)
10
+ # python3 slo-calc.py --selftest
11
+ import argparse
12
+ import sys
13
+
14
+
15
+ def cmd_budget(a):
16
+ frac = 1 - a.slo / 100
17
+ mins = a.window_days * 24 * 60 * frac
18
+ print(f"SLO {a.slo}% @ {a.window_days} 天窗口:")
19
+ print(f" 错误预算 = {frac:.4%} ≈ 不可用 {mins:.0f} 分钟({mins / 60:.1f} 小时)")
20
+ for s in (99.0, 99.5, 99.9, 99.95, 99.99):
21
+ m = a.window_days * 24 * 60 * (1 - s / 100)
22
+ cur = " <== 当前" if abs(s - a.slo) < 1e-9 else ""
23
+ print(f" 参考: {s}% → {m:.0f} 分钟/{a.window_days}天{cur}")
24
+ print("纪律: SLO 从历史数据定(先观测 1–3 个月),别拍'四个九'再倒推;对外 SLA=SLO 打一档折。")
25
+
26
+
27
+ def cmd_burn(a):
28
+ frac = 1 - a.slo / 100
29
+ budget = a.total * frac
30
+ used = a.errors / budget * 100 if budget else 0
31
+ elapsed_share = a.elapsed_days / a.window_days * 100
32
+ rate = used / elapsed_share if elapsed_share else 0
33
+ print(f"窗口 {a.window_days} 天已过 {a.elapsed_days} 天({elapsed_share:.0f}%);总请求 {a.total:,},失败 {a.errors:,}")
34
+ print(f" 错误预算 = {a.total:,} × {frac:.4%} = {budget:,.0f} 次失败额度")
35
+ print(f" 已消耗 {used:.1f}% 燃烧率 = 消耗{used:.1f}% ÷ 时间{elapsed_share:.0f}% = {rate:.2f}")
36
+ if rate > 0:
37
+ days_left = (100 - used) / (used / a.elapsed_days) if used > 0 else float("inf")
38
+ print(f" 按当前速度: 约 {days_left:.1f} 天后烧尽(窗口还剩 {a.window_days - a.elapsed_days} 天)")
39
+ if rate >= 2:
40
+ print(" 判定: [红] 燃烧率≥2 —— 值班介入,查错误来源(变更嫌疑第一问)")
41
+ elif rate > 1:
42
+ print(" 判定: [黄] 燃烧率>1 —— 烧得比时间快,盯紧趋势")
43
+ elif used >= 100:
44
+ print(" 判定: [红] 预算已烧尽 —— 冻结特性发布只保稳定性修复(eng-release 联动,业务提前签认)")
45
+ else:
46
+ print(" 判定: 预算健康(燃烧率≤1)")
47
+
48
+
49
+ def cmd_alert(a):
50
+ frac = 1 - a.slo / 100
51
+ print(f"双窗口燃烧率告警建议(SLO {a.slo}%,月窗口):")
52
+ fast = 0.02 * 30 * 24 # 1h 烧掉月预算 2% → 燃烧率
53
+ slow = 0.05 * 30 * 24 / 6
54
+ print(f" 急(page): 1 小时窗口燃烧率 > {fast:.0f}(=1h 烧掉月预算 2%) → 电话叫人")
55
+ print(f" 缓(工单): 6 小时窗口燃烧率 > {slow:.0f}(=6h 烧掉月预算 5%) → 次日处理")
56
+ print(f" 换算成错误率阈值: 急={fast * frac:.3%} 缓={slow * frac:.3%}(该服务的瞬时失败率)")
57
+ print("纪律: 告警三问过了才配上通道;燃烧率告警替代'错误率>x 持续 y 分钟'的拍脑袋阈值。")
58
+
59
+
60
+ def selftest():
61
+ ns = argparse.Namespace
62
+ cmd_budget(ns(slo=99.9, window_days=30))
63
+ cmd_burn(ns(slo=99.9, total=2600000, errors=4100, window_days=30, elapsed_days=12))
64
+ cmd_alert(ns(slo=99.9))
65
+ print("\nselftest ok")
66
+ return 0
67
+
68
+
69
+ def main():
70
+ if "--selftest" in sys.argv:
71
+ sys.exit(selftest())
72
+ p = argparse.ArgumentParser(description="SLO 错误预算与燃烧率")
73
+ sub = p.add_subparsers(dest="cmd", required=True)
74
+ b = sub.add_parser("budget"); b.add_argument("--slo", type=float, required=True); b.add_argument("--window-days", type=int, default=30)
75
+ r = sub.add_parser("burn"); r.add_argument("--slo", type=float, required=True); r.add_argument("--total", type=int, required=True); r.add_argument("--errors", type=int, required=True); r.add_argument("--window-days", type=int, default=30); r.add_argument("--elapsed-days", type=float, default=15)
76
+ al = sub.add_parser("alert"); al.add_argument("--slo", type=float, required=True)
77
+ a = p.parse_args()
78
+ {"budget": cmd_budget, "burn": cmd_burn, "alert": cmd_alert}[a.cmd](a)
79
+
80
+
81
+ if __name__ == "__main__":
82
+ main()
@@ -0,0 +1,74 @@
1
+ ---
2
+ name: eng-ops
3
+ description: 运维链(事件 P1-P4 分级响应→作战通道与指挥官→oncall 轮值升级→变更管理三类→问题管理与 Postmortem 闭环→容量成本水位→备份恢复演练→SLA/SLO 联动)。工程链运维环节深耕:建值班体系、线上事件处置、复盘、变更管控、备份演练时载入。工单与 ITIL 细则由 itsm-ops 承接。
4
+ version: 1.0.0
5
+ ---
6
+
7
+ # 运维链
8
+
9
+ engineering-chain 的运维环节子链。两条铁律:**恢复优先于根因**;**一切操作留痕**。
10
+ 分工:事前的容错设计/混沌演练/韧性评审走 **eng-reliability**,本链管事中响应与事后闭环;
11
+ 系统层排障(CPU/内存/IO/网络四棵决策树/容器特供)载 **ops-linux**;智能运维(告警聚类/Runbook 问答/排障 Copilot 纪律)载 **ai-aiops**;批量主机运维(金丝雀分批/补丁编排/systemd 规范/CMDB)载 **ops-fleet**。
12
+
13
+ ## 事件分级与响应 SLA
14
+
15
+ | 级别 | 定义 | 响应 | 升级 |
16
+ |---|---|---|---|
17
+ | P1 | 核心业务不可用/数据损坏/资损进行中 | 5 分钟接手,战时状态 | 30 分钟未恢复→管理层知悉;逢 P1 必拉作战通道 |
18
+ | P2 | 核心功能降级/大面积体验劣化 | 15 分钟接手 | 2 小时未恢复→升 P1 处理规格 |
19
+ | P3 | 次要功能异常/单客户阻塞 | 当日处理 | 重复出现 3 次→开问题单 |
20
+ | P4 | 体验瑕疵/优化建议 | 排期 | — |
21
+
22
+ **分级看业务影响,不看技术原因**(一台机器挂了但用户无感=P4;一行配置错但全站白屏=P1)。
23
+
24
+ ## 事件处置动作序
25
+
26
+ 1. **止血四板斧先试**:回滚(最近变更嫌疑第一)→切流(摘节点/切机房)→扩容(资源饱和型)→降级(开关预案,eng-release 运营开关);
27
+ 2. 作战通道:拉群、指定**指挥官**(唯一决策人,可以不是最资深但必须唯一)、分工(操作手/联络人/记录员);
28
+ 3. **15 分钟一次进展播报**,哪怕内容是"无进展,正在排查 X"——沉默比坏消息更消耗信任;
29
+ 4. 证据保全先于恢复操作:现场快照(线程栈/内存/日志段/监控截图)再动手,否则根因永远"疑似";
30
+ 5. 恢复确认用业务指标(下单成功率回升),不是"服务起来了";
31
+ 6. 根因排查转 debug-root-cause(假设-验证法,**变更嫌疑第一问:刚才谁改了什么**——七成事件答案在这)。
32
+
33
+ ## oncall 轮值
34
+
35
+ 主备双人(主 15 分钟无响应自动升备);交接清单:未关事件/近 3 天变更/已知风险与预案位置;
36
+ 升级路径写死并演练:15min 无进展→备份介入,30min→Lead,P1 立即;
37
+ 新人先跟班两轮再独立值班;oncall 工作量计入绩效与调休——**白嫖值班的团队留不住人**。
38
+
39
+ ## 变更管理(事件之母)
40
+
41
+ - 三类分治:**普通变更**(评审+窗口+回滚方案);**标准变更**(预批准模板:证书轮换/白名单调整等低风险高频项,免评审但留痕);**紧急变更**(先做后补审批,24h 内补票);
42
+ - 变更三要素缺一不批:实施方案/验证方法/回滚方案;
43
+ - 高危变更(动生产数据/动网络/动权限)**四眼原则**:一人操作一人复核,逐条念出来再回车;
44
+ - 变更日历全团队可见:冲突检测(同窗口动同一系统)、冻结期(大促/月结)标红;
45
+ - 变更单关联监控:观察期内告警自动关联最近变更单(eng-observability 事件线)。
46
+
47
+ ## 问题管理与 Postmortem
48
+
49
+ - 事件→问题升级判据:P1/P2 必开问题单;P3 同模式 3 次必开;
50
+ - Postmortem 模板:时间线到分钟(发现/响应/止血/恢复各时刻)、五问法根因(问到系统与流程层,禁止停在"某人失误"——**人会重复失误,系统要拦得住**)、影响量化(时长/用户数/损失)、Action 清单(每条有 Owner/期限/验收标准);**作业包**:`references/postmortem-template.md`(直接复制填写,含三回写确认清单与 oncall 交接清单附件);
51
+ - 无指责文化 ≠ 无责任闭环:不追究个人,但 Action 超期升级到管理层月度清账;
52
+ - 复盘会 48h 内开(记忆保鲜),对事故当事人友善,对流程漏洞狠。
53
+
54
+ ## 容量与成本水位
55
+
56
+ 月度水位报告:CPU/内存/磁盘/连接数 TOP10 实例 + 增长斜率外推(**斜率打到 85% 的日期提前 3 个月扩容立项**);
57
+ 僵尸资源季度清理(无流量服务/无主磁盘/超保留期快照);成本异动(环比>20%)当月归因——账单是最诚实的架构评审。
58
+
59
+ ## 备份与恢复演练
60
+
61
+ 3-2-1 原则:3 份副本、2 种介质、1 份异地;
62
+ **备份的有效性=最近一次恢复演练的结果**,不是备份任务的绿灯——季度演练:真恢复、计时、比对数据完整性,RTO/RPO 实测值回填灾备等级表(eng-infra);
63
+ 恢复手册要"新人照着能做":恐慌时刻没人记得住口口相传的步骤。
64
+
65
+ ## SLA/SLO 联动
66
+
67
+ 对外 SLA=对内 SLO 打一档折(内部 99.95% 才敢对外承诺 99.9%);
68
+ SLO 与错误预算机制见 **eng-observability**;预算烧尽→冻结特性发布只保稳定性修复(eng-release 联动)——**这条要提前和业务讲好,烧尽时才有执行力**。
69
+
70
+ ## 使用纪律
71
+
72
+ 生产操作留痕(谁/何时/何命令/为何)+高危四眼;例行操作先脚本化再自动化(office-automation 例程:巡检/清理/报告);
73
+ 每次事件复盘三回写:根因模式入库、缺的告警补上、能自动化的止血动作做成预案开关。
74
+ **运维的成熟度=无聊的程度:例行的都自动化了,剩下的才配叫事件。**
@@ -0,0 +1,67 @@
1
+ # Postmortem 复盘模板(eng-ops 问题管理的落笔件)
2
+
3
+ > 使用纪律:事件恢复后 48h 内开复盘会(记忆保鲜);对人友善,对流程狠;时间线到分钟、根因到系统层、Action 可验收。
4
+ > 本模板直接复制成 `postmortem-YYYYMMDD-事件短名.md` 填写,归档进事件库(eng-docs 知识回写)。
5
+
6
+ ## 1. 元信息
7
+
8
+ | 项 | 内容 |
9
+ |---|---|
10
+ | 事件编号/级别 | INC-____ / P_ |
11
+ | 标题(一句话) | 例:支付回调堆积导致订单状态延迟 2 小时 |
12
+ | 发生时间 → 恢复时间 | ____-__-__ __:__ → __:__(总时长 __ 分钟) |
13
+ | 影响量化 | 影响用户 __ 人/订单 __ 笔/损失 __ 元/SLO 预算消耗 __%(拍不准就给区间,不许空着) |
14
+ | 发现方式 | 告警 / 用户投诉 / 内部发现 ← **投诉先于告警=监控欠账,第 6 节必须有 Action** |
15
+ | 参与人 | 指挥官:__ 操作:__ 记录:__ |
16
+
17
+ ## 2. 时间线(到分钟;含"决策点"不只"动作")
18
+
19
+ | 时刻 | 事件/动作 | 备注 |
20
+ |---|---|---|
21
+ | __:__ | 首个异常信号(哪个指标/告警) | |
22
+ | __:__ | 值班响应,初判为 __ | 初判错了也要记——错的初判是流程改进素材 |
23
+ | __:__ | 止血动作:回滚/切流/扩容/降级 __ | 为什么选这个,当时依据什么 |
24
+ | __:__ | 业务指标恢复(以 __ 指标回升为准) | 恢复确认用业务指标,不是"服务起来了" |
25
+ | __:__ | 根因确认 | |
26
+
27
+ ## 3. 根因(五问法,问到系统与流程层)
28
+
29
+ - 直接原因:__(什么坏了)
30
+ - 为什么 1:__ → 为什么 2:__ → 为什么 3:__ → 为什么 4/5:__
31
+ - **停在"某人失误"=没问完**:人会重复失误,要问"什么样的防线本可拦住这次失误"(门禁/评审/预案/告警)。
32
+ - 根因分类(勾选,进模式库统计): □ 变更引入 □ 容量/性能 □ 依赖故障 □ 配置错误 □ 代码缺陷 □ 数据问题 □ 基础设施 □ 流程缺失
33
+
34
+ ## 4. 做得好的(保持项)
35
+
36
+ - 例:止血 8 分钟(四板斧先回滚);播报节奏 15 分钟一报没有断。
37
+
38
+ ## 5. 暴露的问题(不指名,指环节)
39
+
40
+ - 例:告警晚于用户投诉 12 分钟;回滚预案文档过期,实际步骤靠回忆。
41
+
42
+ ## 6. Action 清单(每条三要素齐才许关会)
43
+
44
+ | # | Action | Owner | 期限 | 验收标准(可判定) | 类型 |
45
+ |---|---|---|---|---|---|
46
+ | 1 | 例:支付回调堆积量告警(阈值=常态×3) | __ | __-__ | 告警上线且演练触发一次 | 监控补位 |
47
+ | 2 | 例:回滚 Runbook 重写并演练 | __ | __-__ | 新值班照 Runbook 独立完成演练 | 预案 |
48
+ | 3 | 例:同模式风险面横扫(其余回调接口) | __ | __-__ | 横扫清单+整改工单挂出 | 防复发 |
49
+
50
+ > Action 纪律:有 Owner 有期限有验收标准;超期升级管理层月度清账;
51
+ > **三必查**:缺的告警补了吗(eng-observability)/暴露的容错缺口进混沌清单了吗(eng-reliability)/该自动化的止血做成预案开关了吗(eng-automation)。
52
+
53
+ ## 7. 三回写确认(工程链复利,勾了才算闭环)
54
+
55
+ - [ ] 根因模式入库(eng-ops 模式统计)
56
+ - [ ] 本可更早发现的信号已补(eng-observability"哪个信号本可以更早")
57
+ - [ ] 相关链的坑清单/判据表已增补(具体链:______)
58
+
59
+ ---
60
+
61
+ # 附:oncall 交接清单模板(每次换班 5 分钟过一遍)
62
+
63
+ - 未关事件: INC-__ 状态/下一步/联系人
64
+ - 近 3 天变更: __(变更日历链接)——变更嫌疑第一问的弹药
65
+ - 已知风险与预案位置: __(如"明晨月结批量,失败预案见 Runbook-x")
66
+ - 特殊值守要求: __(灰度观察中的服务/客户升级窗口 env-private-deploy)
67
+ - 工具确认: 告警通道收得到/VPN 与跳板可登/一键体检脚本可用(ops-linux quick-triage)
@@ -0,0 +1,73 @@
1
+ ---
2
+ name: eng-performance
3
+ description: 性能链(性能口径 P99/RT/QPS→基准测试纪律→压测方案判据(阶梯/浸泡/尖峰/全链路)→RED/USE 瓶颈定位路径→分层优化手段表→容量水位规划→性能回归防线)。工程链性能环节深耕:接口慢、压测立项、容量评估、大促备战、性能劣化排查时载入。画像工具与调优细节由 perf-optimize、慢 SQL 由 sql-tuning 承接。
4
+ version: 1.0.0
5
+ ---
6
+
7
+ # 性能链
8
+
9
+ engineering-chain 的性能环节子链。铁律一句话:**无度量不优化,无基线不谈劣化**。
10
+
11
+ ## 口径先行(口径错,全错)
12
+
13
+ - 四件套一起看:RT 分布(P50/P95/P99)、吞吐(QPS/TPS)、错误率、饱和度(资源余量)——只看平均 RT=没看(长尾才是投诉来源);
14
+ - 换算关系:QPS ≈ 并发数 ÷ 平均 RT(秒),混淆并发与 QPS 是压测方案第一错;
15
+ - 性能目标写法(进验收标准,eng-requirements):"P99<300ms @ 1000QPS,错误率<0.1%,持续 30 分钟"——四要素缺一不可判定;
16
+ - 区分吞吐型(批处理,看单位时间处理量)与延迟型(在线接口,看分位数),优化手段常互斥(攒批提吞吐会伤延迟)。
17
+
18
+ ## 基准测试纪律
19
+
20
+ 同机器/同数据规模/同参数才可比;预热剔除(JIT/缓存爬坡期不计入);多轮取分布(P99 波动>20% 先查环境再下结论);
21
+ 记录环境快照(版本/配置/数据量/依赖状态)——**没有环境快照的基准数据三个月后就是垃圾数字**。
22
+
23
+ ## 压测方案判据
24
+
25
+ | 类型 | 目的 | 要点 |
26
+ |---|---|---|
27
+ | 阶梯加压 | 找容量拐点 | 逐级加压观察 RT 拐点与错误率抬头;拐点×0.7=安全水位 |
28
+ | 浸泡(4h+) | 找泄漏与劣化 | 恒定中压;盯内存/连接数/句柄斜率,斜率>0=有泄漏 |
29
+ | 尖峰 | 验突发弹性 | 瞬时 N 倍;看限流降级是否按预案动作、恢复时间 |
30
+ | 全链路 | 大促合练 | 影子流量+数据隔离(影子表/标记透传);**压测数据污染生产=事故** |
31
+
32
+ 环境纪律:等比环境直接压;缩容环境标折算系数并写明局限(缓存命中率与连接池行为不等比缩放)。
33
+
34
+ ## 瓶颈定位路径(先服务后资源,逐层下钻)
35
+
36
+ 1. **RED 看服务**:哪个服务的请求率/错误率/时延异常——先锁定层;
37
+ 2. **USE 看资源**:该层的 CPU/内存/磁盘 IO/网络的利用率、饱和度、错误——CPU 高看火焰图,CPU 不高看等待(锁/IO/下游);
38
+ 3. 常见瓶颈签名速查:线程池满+CPU 低=下游慢或锁;GC 频繁=分配率高或堆小;DB 连接池满=慢查询占坑(sql-tuning);
39
+ RT 齐刷刷抬升=共享资源饱和;只有 P99 差=长尾(GC 停顿/缓存未命中路径/热点键);
40
+ 4. **一次只改一个变量**,改前留基线,改后对照——同时改三处=不知道哪个起效,下次还得瞎猜。
41
+
42
+ ## 分层优化手段表(症状→手段→代价)
43
+
44
+ | 层 | 手段 | 代价/风险 |
45
+ |---|---|---|
46
+ | 应用 | 池化(连接/线程/对象)、异步化、批量化、本地缓存 | 异步化提吞吐不降单次延迟;本地缓存有一致性窗口 |
47
+ | 运行时 | JVM/GC 调优(dev-java)、GOMEMLIMIT(dev-go)等 | 参数复制别人的=刻舟求剑,要配自己的画像 |
48
+ | 数据库 | 索引/慢查/N+1 治理(sql-tuning)、读写分离 | 索引写放大;读写分离有复制延迟 |
49
+ | 缓存 | 引入判据读写比>10:1;穿透(空值缓存)/击穿(单飞)/雪崩(过期打散)三防(工程细则 **db-redis**) | 一致性复杂度;三防缺一个=事故预定 |
50
+ | 网络 | 连接复用/压缩/CDN/就近接入 | 压缩耗 CPU;CDN 缓存键设计错=窜数据 |
51
+ | 前端 | 首屏与资源优化(dev-frontend Core Web Vitals) | — |
52
+ | 架构 | 削峰队列/降级预案/单元化(eng-architecture) | 复杂度跳变,走架构评审 |
53
+
54
+ **优化 ROI 先算再动手**(Amdahl 定律:占总耗时 20% 的环节优化到零也只快 25%)——火焰图上最宽的块才值得动。
55
+
56
+ ## 容量规划
57
+
58
+ 安全水位=压测拐点×0.7;扩容触发线=水位 70% 持续一周(给采购/扩容留提前量);
59
+ 大促容量=日常峰值×业务给的系数×1.5 安全余量,**系数要业务签字**(技术自己拍=背锅);
60
+ 容量台账季度复核,扩完回填实测(eng-ops 水位月报衔接)。
61
+
62
+ ## 性能回归防线
63
+
64
+ 核心接口基线入 CI/发布门禁:对比基线劣化>10% 报警、>30% 阻断(阈值按业务调);
65
+ 每版本出性能对照表(发布清单项,eng-release);依赖升级(dependency-upgrade)后必跑基准——**性能是被一次次"没多大影响"的提交吃掉的**。
66
+
67
+ **作业包**:`scripts/perf-baseline.py`(延迟样本分位数报告与基线对比,P99 劣化超阈值退出码 1——接 CI 即性能门禁)。
68
+
69
+ ## 使用纪律
70
+
71
+ 无 profile 不动手(perf-optimize 承接画像取证);优化 PR 必附前后对照数据与压测条件;
72
+ 过早优化是万恶之源,但**容量估算不是优化,是设计**(eng-architecture 公式);
73
+ 每次性能事故回写:瓶颈签名入速查表、缺的监控补上(eng-observability)。
@@ -0,0 +1,110 @@
1
+ #!/usr/bin/env python3
2
+ # 性能基线对比器(eng-performance 回归防线的可执行版):两份延迟样本→分位数对比→劣化判定。
3
+ # python3 stdlib,零依赖。样本文件=每行一个延迟值(ms),压测/日志/埋点导出皆可。
4
+ # 用法:
5
+ # python3 perf-baseline.py report samples.txt # 单份样本出分位数报告
6
+ # python3 perf-baseline.py compare baseline.txt current.txt [--p99-limit 10] [--p50-limit 15]
7
+ # python3 perf-baseline.py --selftest
8
+ # 退出码: 0=无劣化 1=劣化超阈值(接 CI 即性能门禁,cicd-pipeline) 2=输入错误。
9
+ # 纪律: 同机器同数据同参数才可比(基准纪律);样本 <200 条置信度差,报告会标注。
10
+ import sys
11
+
12
+
13
+ def load(path):
14
+ vals = []
15
+ try:
16
+ with open(path, encoding="utf-8") as f:
17
+ for ln in f:
18
+ ln = ln.strip().rstrip("ms").strip()
19
+ if not ln or ln.startswith("#"):
20
+ continue
21
+ try:
22
+ vals.append(float(ln))
23
+ except ValueError:
24
+ pass
25
+ except OSError as e:
26
+ print(f"[错误] {path}: {e}")
27
+ sys.exit(2)
28
+ if not vals:
29
+ print(f"[错误] {path} 无有效样本(每行一个毫秒数)")
30
+ sys.exit(2)
31
+ return sorted(vals)
32
+
33
+
34
+ def pct(vs, p):
35
+ if not vs:
36
+ return 0.0
37
+ k = (len(vs) - 1) * p / 100
38
+ lo, hi = int(k), min(int(k) + 1, len(vs) - 1)
39
+ return vs[lo] + (vs[hi] - vs[lo]) * (k - lo)
40
+
41
+
42
+ def stats(vs):
43
+ return {
44
+ "n": len(vs), "mean": sum(vs) / len(vs), "min": vs[0], "max": vs[-1],
45
+ "P50": pct(vs, 50), "P90": pct(vs, 90), "P95": pct(vs, 95), "P99": pct(vs, 99),
46
+ }
47
+
48
+
49
+ def show(name, s):
50
+ warn = " [!] 样本<200,置信度差(多轮取分布,eng-performance 基准纪律)" if s["n"] < 200 else ""
51
+ print(f"{name}: n={s['n']}{warn}")
52
+ print(f" P50={s['P50']:.1f} P90={s['P90']:.1f} P95={s['P95']:.1f} P99={s['P99']:.1f} "
53
+ f"mean={s['mean']:.1f} max={s['max']:.1f}")
54
+
55
+
56
+ def cmd_report(path):
57
+ show(path, stats(load(path)))
58
+ print("提醒: 只看平均值=没看;长尾(P99)才是用户体验与投诉来源。")
59
+ return 0
60
+
61
+
62
+ def cmd_compare(base_p, cur_p, p99_limit, p50_limit):
63
+ b, c = stats(load(base_p)), stats(load(cur_p))
64
+ show("基线", b)
65
+ show("当前", c)
66
+ print("---- 对比(正=劣化) ----")
67
+ rc = 0
68
+ for k, limit in (("P50", p50_limit), ("P95", None), ("P99", p99_limit)):
69
+ if b[k] <= 0:
70
+ continue
71
+ d = (c[k] - b[k]) * 100 / b[k]
72
+ mark = ""
73
+ if limit is not None and d > limit:
74
+ mark = f" <== 超阈值 {limit}%,阻断"
75
+ rc = 1
76
+ elif d > 5:
77
+ mark = " (关注)"
78
+ print(f" {k}: {b[k]:.1f} → {c[k]:.1f} ({d:+.1f}%){mark}")
79
+ if rc:
80
+ print("判定: 劣化超阈值 —— 阻断合入/发布;火焰图定位后再来(无 profile 不优化)。")
81
+ else:
82
+ print("判定: 无显著劣化(阈值内波动;环境噪音大时多轮复测再下结论)。")
83
+ return rc
84
+
85
+
86
+ def selftest():
87
+ import tempfile, os, random
88
+ random.seed(7)
89
+ with tempfile.TemporaryDirectory() as d:
90
+ b, c = os.path.join(d, "b.txt"), os.path.join(d, "c.txt")
91
+ open(b, "w").write("\n".join(str(random.gauss(100, 10)) for _ in range(500)))
92
+ open(c, "w").write("\n".join(str(random.gauss(130, 30)) for _ in range(500)))
93
+ assert cmd_compare(b, c, 10, 15) == 1, "应判劣化"
94
+ assert cmd_compare(b, b, 10, 15) == 0, "自比应通过"
95
+ print("selftest ok: 分位数/劣化判定/退出码正常")
96
+ return 0
97
+
98
+
99
+ if __name__ == "__main__":
100
+ a = sys.argv[1:]
101
+ if "--selftest" in a:
102
+ sys.exit(selftest())
103
+ if len(a) >= 2 and a[0] == "report":
104
+ sys.exit(cmd_report(a[1]))
105
+ if len(a) >= 3 and a[0] == "compare":
106
+ p99 = float(a[a.index("--p99-limit") + 1]) if "--p99-limit" in a else 10.0
107
+ p50 = float(a[a.index("--p50-limit") + 1]) if "--p50-limit" in a else 15.0
108
+ sys.exit(cmd_compare(a[1], a[2], p99, p50))
109
+ print(__doc__ or "用法见文件头注释")
110
+ sys.exit(2)
@@ -0,0 +1,79 @@
1
+ ---
2
+ name: eng-planning
3
+ description: 需求排期子链(WBS 拆解→三点/故事点估算→依赖与关键路径→资源拉平→关键链缓冲→里程碑验收→燃尽追踪→延期三案→估时校准库)。工程链排期环节深耕:出项目计划、迭代规划、被问"什么时候能上线"、项目延期救火时载入。工时表与甘特模板由 project-management 承接。
4
+ version: 1.0.0
5
+ ---
6
+
7
+ # 需求排期子链
8
+
9
+ engineering-chain 的排期环节子链。输入:需求基线(eng-requirements)+架构方案(eng-architecture,决定任务结构);
10
+ 产物:WBS、里程碑计划、依赖矩阵、风险登记册、燃尽基线。
11
+
12
+ ## WBS 拆解
13
+
14
+ - 粒度:拆到 **≤3 人天**;>3 天的任务=还没想清楚,继续拆或标注不确定性研究(spike,时间盒)。
15
+ - 动词开头(“实现 XX 接口”“迁移 XX 表”),交付物可验证。
16
+ - **100% 规则漏项清单**(计划总在这些地方漏):环境搭建、测试数据准备、联调(按接口数×0.5 天起)、
17
+ 代码评审与返工、部署与配置、埋点、文档、bug 修复期(开发工时×20–30%)、上线值守、需求答疑损耗。
18
+ - 使能任务(重构/升级)进 WBS 并占容量,不许"顺手做"——顺手=延期之源。
19
+
20
+ ## 估算方法判据
21
+
22
+ | 方法 | 适用 | 要点 |
23
+ |---|---|---|
24
+ | 三点法 PERT | 单任务工时 | (乐观+4×最可能+悲观)÷6;悲观值要真悲观(联调对方没空/环境坏两天) |
25
+ | 故事点 | 迭代制团队 | 斐波那契相对估;锚定 2–3 个基准故事;点数不跨团队比较 |
26
+ | 类比法 | 有历史相似项 | 查估时校准库,乘个人/模块系数 |
27
+
28
+ 纪律:**谁干活谁估**(替估必偏乐观);集体估(planning poker 式)暴露理解分歧——分歧本身比数字值钱;
29
+ 估算给区间不给单点;对外承诺用 **P80** 不用 P50。
30
+
31
+ ## 依赖与关键路径
32
+
33
+ - 依赖矩阵:任务×任务标 FS/SS/FF;外部依赖(其他团队/采购/审批)单独成表,**每条挂确认人与承诺日期**——外部依赖是延期第一杀手。
34
+ - 关键路径上的任务:每日站会必问、资源优先保、风险预案必备;非关键路径任务有浮动时间,别用最紧资源。
35
+ - 并行度检查:纸面并行≠实际并行(同一个人/同一环境/同一接口方=串行)。
36
+
37
+ ## 资源与容量
38
+
39
+ - 人均可用工时打折:会议/支撑/答疑扣 20–30%;新人系数 0.5–0.7(前两月);跨项目的人按实际投入比折算,**"他有空的时候做"=没有排期**。
40
+ - 迭代容量=近 3 个迭代实际完成速率均值(不是理想值);预留 10–20% 给技术债与突发(eng-architecture 债台账、线上问题)。
41
+
42
+ ## 缓冲策略(关键链法)
43
+
44
+ - 单任务估算里的私藏缓冲挤掉(用激进估算),**项目级缓冲统一放末尾**,大小=关键路径的 15–20%;
45
+ - 追踪看两个比率:缓冲消耗率 vs 进度完成率——缓冲烧得比进度快=黄灯,快一倍=红灯启动延期三案;
46
+ - 里程碑之间不共享缓冲(防止前松后紧)。
47
+
48
+ ## 里程碑定义
49
+
50
+ 里程碑=可验收的交付物,不是百分比:"登录链路可演示""压测报告出炉"是里程碑,"完成 80%"不是。
51
+ 每个里程碑挂验收人+验收标准(来自 eng-requirements);里程碑前一周做前置检查:DoD 逐项预核,来不及的提前暴露。
52
+
53
+ ## 进度追踪
54
+
55
+ - 燃尽/燃起图每日更新;**偏差>15% 触发重排**,不许"后面赶一赶"糊弄——历史上"赶一赶"从未发生过。
56
+ - 状态只有三种:完成(过验收标准)/未开始/进行中——"完成 90%"按未完成对待(最后 10% 消耗 50% 时间是常态)。
57
+ - 风险登记册每周过:概率×影响排序,TOP3 必须有应对动作(不是"关注")。
58
+
59
+ ## 延期三案(提前给,别等爆雷)
60
+
61
+ | 方案 | 操作 | 代价明说 |
62
+ |---|---|---|
63
+ | 砍范围 | MoSCoW 的 Could/Won't 先砍,Should 谈判 | 功能少;**默认首选,伤害最小** |
64
+ | 顺延时间 | 关键路径重算给新 P80 日期 | 商务/市场承诺违约成本 |
65
+ | 加资源 | 只对可并行块有效 | Brooks 定律:新人上手期反拖慢;沟通成本平方增长 |
66
+
67
+ 三案都给数字和代价,**让业务方选,不替业务方选**;技术方案降级(临时方案上、重构后补)算第四案,必须同时立还债任务进台账,否则就是永久方案。
68
+
69
+ ## 估时校准库(排期的复利所在)
70
+
71
+ 结项后回写:每任务 实际/估算 比、偏差原因归类(漏项/依赖延误/需求变更/低估复杂度)、个人与模块系数。
72
+ 下次排期先查库:同类任务历史偏差×1.2 起步。**没有校准库,每次排期都是第一次排期。**
73
+
74
+ **作业包**:`scripts/schedule-calc.py`(pert/project/velocity 三算:三点估算、项目 P50/P80、迭代速率预测——承诺口径 P80、缓冲放末尾)。
75
+
76
+ ## 使用纪律
77
+
78
+ 无 WBS 不承诺日期;外部依赖必有确认人;承诺 P80;偏差>15% 重排并同步干系人;
79
+ 结项必回写校准库。**排期的目的不是"排出好看的表",是让延期在第一周而不是最后一周暴露。**
@@ -0,0 +1,101 @@
1
+ #!/usr/bin/env python3
2
+ # 排期计算器(eng-planning 三点估算/关键链缓冲/速率预测的可执行版)。python3 stdlib,零依赖。
3
+ # 用法:
4
+ # python3 schedule-calc.py pert --o 3 --m 5 --p 12 # 单任务三点估算
5
+ # python3 schedule-calc.py project --csv tasks.csv [--buffer 0.18] # 项目级:CSV=任务,乐观,最可能,悲观
6
+ # python3 schedule-calc.py velocity --history 12,15,10,14 --backlog 60 # 迭代速率预测
7
+ # python3 schedule-calc.py --selftest
8
+ # 纪律输出:承诺用 P80 不用 P50;缓冲统一放末尾不摊到单任务(关键链法)。
9
+ import argparse
10
+ import csv
11
+ import math
12
+ import sys
13
+
14
+
15
+ def pert_one(o, m, p):
16
+ e = (o + 4 * m + p) / 6
17
+ sd = (p - o) / 6
18
+ return e, sd
19
+
20
+
21
+ def cmd_pert(a):
22
+ e, sd = pert_one(a.o, a.m, a.p)
23
+ print(f"E=(乐观{a.o}+4×最可能{a.m}+悲观{a.p})÷6 = {e:.1f} σ=(悲观-乐观)÷6 = {sd:.1f}")
24
+ print(f"P50≈{e:.1f} P80≈{e + 0.84 * sd:.1f} P95≈{e + 1.65 * sd:.1f}")
25
+ print("对外承诺口径=P80(eng-planning 纪律);悲观值要真悲观(联调对方没空/环境坏两天)。")
26
+ if a.p < a.m * 1.5:
27
+ print("[提醒] 悲观值 <1.5×最可能 —— 悲观得不够悲观的嫌疑,复核一下")
28
+
29
+
30
+ def cmd_project(a):
31
+ rows = []
32
+ with open(a.csv, encoding="utf-8") as f:
33
+ for ln in csv.reader(f):
34
+ if not ln or ln[0].startswith("#") or ln[0] in ("任务", "name"):
35
+ continue
36
+ if len(ln) < 4:
37
+ print(f"[跳过] 列不足: {ln}")
38
+ continue
39
+ rows.append((ln[0], float(ln[1]), float(ln[2]), float(ln[3])))
40
+ if not rows:
41
+ print("[错误] CSV 无有效行(格式: 任务,乐观,最可能,悲观)")
42
+ return 2
43
+ total_e, var = 0.0, 0.0
44
+ print(f"{'任务':<20} {'E':>6} {'σ':>5}")
45
+ for name, o, m, p in rows:
46
+ e, sd = pert_one(o, m, p)
47
+ total_e += e
48
+ var += sd * sd
49
+ big = " <== >3 人天,继续拆(WBS 粒度纪律)" if e > 3 and a.unit == "day" else ""
50
+ print(f"{name:<20} {e:>6.1f} {sd:>5.1f}{big}")
51
+ sd_t = math.sqrt(var)
52
+ buf = total_e * a.buffer
53
+ print(f"\n合计 E={total_e:.1f} 项目σ={sd_t:.1f}(√Σσ²,独立假设——强依赖任务实际更差)")
54
+ print(f"统计口径: P50={total_e:.1f} P80={total_e + 0.84 * sd_t:.1f} P95={total_e + 1.65 * sd_t:.1f}")
55
+ print(f"关键链口径: 激进估算 {total_e:.1f} + 项目缓冲 {buf:.1f}({a.buffer:.0%},统一放末尾) = {total_e + buf:.1f}")
56
+ print("追踪: 缓冲消耗率 vs 进度完成率——烧得比进度快=黄灯,快一倍=红灯启动延期三案。")
57
+
58
+
59
+ def cmd_velocity(a):
60
+ hist = [float(x) for x in a.history.split(",") if x.strip()]
61
+ n = len(hist)
62
+ mean = sum(hist) / n
63
+ sd = math.sqrt(sum((x - mean) ** 2 for x in hist) / (n - 1)) if n > 1 else 0
64
+ print(f"近 {n} 迭代速率: 均值 {mean:.1f} σ {sd:.1f}(用近 3 个迭代实际值,不是理想值)")
65
+ usable = mean * (1 - a.reserve)
66
+ print(f"可用容量 = {mean:.1f} × (1-还债预留{a.reserve:.0%}) = {usable:.1f}/迭代")
67
+ if usable > 0:
68
+ p50 = a.backlog / usable
69
+ lo = a.backlog / (usable + 0.84 * sd * (1 - a.reserve)) if sd else p50
70
+ hi = a.backlog / max(usable - 0.84 * sd * (1 - a.reserve), 0.1) if sd else p50
71
+ print(f"待办 {a.backlog} → 预计 {p50:.1f} 个迭代(P50);区间 {lo:.1f} ~ {hi:.1f}(±0.84σ)")
72
+ print(f"对外口径取上限 {math.ceil(hi)} 个迭代(P80 精神)。")
73
+
74
+
75
+ def selftest():
76
+ ns = argparse.Namespace
77
+ cmd_pert(ns(o=3, m=5, p=12))
78
+ import tempfile, os
79
+ with tempfile.TemporaryDirectory() as d:
80
+ f = os.path.join(d, "t.csv")
81
+ open(f, "w", encoding="utf-8").write("任务,乐观,最可能,悲观\n接口开发,2,3,6\n联调,1,2,5\n压测,1,1,3\n")
82
+ cmd_project(ns(csv=f, buffer=0.18, unit="day"))
83
+ cmd_velocity(ns(history="12,15,10,14", backlog=60, reserve=0.15))
84
+ print("\nselftest ok")
85
+ return 0
86
+
87
+
88
+ def main():
89
+ if "--selftest" in sys.argv:
90
+ sys.exit(selftest())
91
+ p = argparse.ArgumentParser(description="排期计算(承诺 P80,缓冲放末尾)")
92
+ sub = p.add_subparsers(dest="cmd", required=True)
93
+ q = sub.add_parser("pert"); q.add_argument("--o", type=float, required=True); q.add_argument("--m", type=float, required=True); q.add_argument("--p", type=float, required=True)
94
+ j = sub.add_parser("project"); j.add_argument("--csv", required=True); j.add_argument("--buffer", type=float, default=0.18); j.add_argument("--unit", default="day")
95
+ v = sub.add_parser("velocity"); v.add_argument("--history", required=True); v.add_argument("--backlog", type=float, required=True); v.add_argument("--reserve", type=float, default=0.15)
96
+ a = p.parse_args()
97
+ sys.exit({"pert": cmd_pert, "project": cmd_project, "velocity": cmd_velocity}[a.cmd](a) or 0)
98
+
99
+
100
+ if __name__ == "__main__":
101
+ main()