perf(hooks): SessionStart p95 7.1 s from about 26 per-plugin prerequisites rows; use one shared async runner
Maintainer thường phản hồi trong vòng 1 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 35/100
- Loại issue
- Tái cấu trúc
- Độ rõ ràng
- Khá rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Công nghệ
- json, powershell, shell
- Lĩnh vực
- developer-experience
Hướng nghiên cứu
Start with the SessionStart row in plugins/harness-ops/hooks/hooks.json (around lines 507-526) and the shared lib/prerequisites.sh and lib/prerequisites.ps1, including the notice latch at lines 15-40 of prerequisites.sh. First settle the PPID discrepancy by checking which half of the row runs under a Claude Code hook launch. Done means one combined SessionStart runner replaces the per-plugin rows, grep -l prerequisites.ps1 plugins/*/hooks/hooks.json returns 0 or 1, and a session without node shows one notice.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Related: #6244 (Windows performance audit tracker), #6251 (matcher fix, closed), #6130 (node-notice exit 127), #4373 (hook fan-out umbrella).
Problem
Every plugin that needs a prerequisite check registers its own SessionStart row. 26 hooks.json files carry a prerequisites.sh / prerequisites.ps1 node-notice row, and 8 formatter plugins add a prerequisites.mjs probe row. Each row starts its own process tree, and SessionStart gates the first response. The hooks docs say: "SessionStart runs on every session, so keep these hooks fast" (https://code.claude.com/docs/en/hooks#sessionstart).
Measured
Method: OTEL hook_execution_complete.total_duration_ms for SessionStart on the windows lane (melo-desk-001), plus direct timing of one row on the same host (date +%s%N around the command, 3 runs).
| what | value |
|---|---|
| SessionStart wall-clock, p95 | 7.1 s (go-faster run 20261008T152359Z, hooks area) |
| plugin SessionStart rows with a prerequisites check | 26 hooks.json files (grep -l prerequisites.ps1 plugins/*/hooks/hooks.json) |
powershell -NoProfile -ExecutionPolicy Bypass -File lib/prerequisites.ps1 node-notice ... alone |
196 / 158 / 158 ms |
sh lib/prerequisites.sh node-notice ... alone |
31 / 30 ms |
the whole row as written, run under bash -c |
52 / 50 / 49 ms |
bare node -e 0 / bare bash -c true |
52 ms / 29 ms |
Discrepancy to settle first: the row is sh prerequisites.sh node-notice ...; ${PPID:+exit}; powershell ... prerequisites.ps1 .... Under Git Bash PPID is set, so the row exits before the PowerShell half and costs about 50 ms, not about 150 ms. The reported ~147 ms per row (22 plugins) applies only where the PowerShell half runs, which is the #6130 case (/bin/sh is not bash). Confirm which half runs inside Claude Code hook launches on this host (a debug log of one startup shows it) before sizing the saving.
Either way the rows are ~26 separate process launches that each answer the same question (is node on PATH), and they run before the first response.
Where
Example (plugins/harness-ops/hooks/hooks.json:507-526, same shape in 25 other plugins, e.g. plugins/eol-normalizer/hooks/hooks.json, plugins/actionlint/hooks/hooks.json:57):
"command": "sh \"${CLAUDE_PLUGIN_ROOT}/lib/prerequisites.sh\" node-notice /harness-ops:check; ${PPID:+exit}; powershell -NoProfile -ExecutionPolicy Bypass -File \"${CLAUDE_PLUGIN_ROOT}/lib/prerequisites.ps1\" node-notice /harness-ops:check",
"timeout": 10
Files with the row: actionlint, animation, autonomy, bash-format, biome-format, context-budget, context-guard, desktop-notification, discovery, disk-hygiene, eol-normalizer, explainer-video, go-format, guardrails, harness-ops, instruction-placement, markdown-format, multi-agent, powershell-format, rate-limit-guard, ruff-format, session-flow, source-control, speech, testing, typos-format.
Proposed fix
- One shared prerequisites runner: a single SessionStart row (in one always-enabled plugin, for example harness-ops) that checks
nodeonce and the per-plugin binaries from each plugin'sprerequisites.json, and prints one combined notice. The per-plugin rows are then removed. - Mark that one row
"async": true. The prerequisites notice is advisory and carries no decision, so it loses nothing by arriving on the next turn.
Basis: async hooks run "in the background without blocking Claude", cannot block or return decisions, and are not subject to timeout once running; output is delivered on the next conversation turn (https://code.claude.com/docs/en/hooks#run-hooks-in-the-background, Limitations: "Each execution creates a separate background process. There is no deduplication across multiple firings"). Basis for keeping the row cheap: https://code.claude.com/docs/en/hooks#sessionstart.
Risk to check: a plugin that disables itself without node (the notice's job) must still surface the warning once; the notice latch (lib/prerequisites.sh:15-40) has to move into the shared runner.
Expected saving
Start-up process count drops from about 26 to 1 (plus the 8 formatter probes folded in). If the PowerShell half runs on the affected hosts: about 22 x 147 ms of CPU removed, and the 7.1 s p95 should fall by whatever share the rows hold on the critical path (hooks run in parallel, so the p95 improves through less contention rather than a sum). Where the half is skipped: about 26 x 50 ms of CPU. The wall-clock saving needs the after-measurement below.
Verify after the fix
grep -l 'prerequisites.ps1' plugins/*/hooks/hooks.json | wc -lreturns 0 (or 1 for the runner)./harness-ops:observability latencySessionStart p50/p95 over at least 100 fires before and after (OTELhook_execution_complete, eventSessionStart).- Kill
nodefrom PATH in a test session: one combined notice appears, once per session.
- Ngôn ngữ chính
- Shell
- Star
- 22
- Fork
- 2
- Merge trung bình
- 6 giờ 42 phút
- Pull request đã merge (30 ngày)
- 902
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Không có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của melodic-software/claude-code-plugins
-
needs-triage priority: medium
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
melodic-software/claude-code-plugins#7288 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
knowledge: docpage-digest dual verification defines no verdict vocabulary or pass/fail thresholdĐang mởneeds-human needs-triage
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
melodic-software/claude-code-plugins#7286 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
needs-triage priority: low
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
melodic-software/claude-code-plugins#7282 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
needs-triage priority: medium
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 62/100
melodic-software/claude-code-plugins#7273 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
needs-human needs-triage
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 79/100
melodic-software/claude-code-plugins#7232 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của melodic-software/claude-code-plugins
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 67/100
-
Route 53 DNS analytics/insights adds an observability signal for the DNS layerCó thể đã có người làm Có pull request liên kết đang mở hoặc đã được merge. Đang mởdocumentation enhancement
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
-
Set wallpaperĐang mởnew-addition
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 60/100
-
needs-triage Platform(Default)
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
Maintainer thường phản hồi trong vòng 1 ngày
-
triage
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
winapps-org/winapps#984 ·