Two ready backlog fixes: Claude MessageDisplay mapping + obs worker lcov#513
Merged
NikashPrakash merged 2 commits intoJul 23, 2026
Merged
Conversation
Claude Code documents a MessageDisplay hook event (between Notification and PreCompact), but claudeEventTable in internal/platform/hooks.go had no message_display key, so a HookSpec.When:"message_display" silently failed to render for Claude (mapEventName ok=false). Every other platform table already has exact parity with its vendor surface; this was the one genuine gap (docs/PLATFORM_DIRS_DOCS.md audit marked it). - hooks.go: add "message_display": "MessageDisplay" (1:1, no gate) in vendor order, reusing the P1d Claude-wider snake_case convention. - hooks_test.go: mapper + render coverage for message_display; still ok=false on codex/cursor/copilot/antigravity (D2, no cross-platform inference). - docs/HOOKS.md + PLATFORM_DIRS_DOCS.md: add the row, flip the audit gap to mapped, drop the stale 'separately-routed' claim. - Resolves the platform-dirs-claude-message-display fold-back; routed to loop-discipline-stop-hooks/fold-backs.
The obs/ Cloudflare-worker package has tests but emitted no coverage, and sonar.javascript.lcov.reportPaths pointed at no obs lcov, so every obs/src/*.ts line read 0% on the merged Sonar scan - not untested, just unsignalled. Any obs-touching PR then fights the 80% new_coverage gate for lack of a report (seen on #503). - obs/package.json: add c8; test:coverage emits obs/coverage/lcov.info (--all --src=src so all obs/src files are surfaced, SF: paths obs-relative to match how Sonar resolves the dashboard report). - sonar-project.properties: add obs/coverage/lcov.info to the lcov reportPaths. - .github/workflows/test.yml: in the coverage-gate job, install obs deps (--ignore-scripts per S6505 + rebuild esbuild) and run test:coverage before the scan, mirroring the dashboard step. Verified locally: npm ci --ignore-scripts && npm rebuild esbuild && npm run test:coverage -> 18 pass, lcov lists all 6 obs/src files.
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



Two small, ready backlog items promoted from the triage. Independent commits.
1.
feat(hooks): map ClaudeMessageDisplayClaude Code documents a
MessageDisplayhook event (betweenNotificationandPreCompact), butclaudeEventTablehad nomessage_displaykey, soHookSpec.When: "message_display"silently failed to render for Claude (mapEventName→ok=false). Every other platform table already had exact vendor parity — this was the one real gap thePLATFORM_DIRS_DOCS.mdaudit flagged.internal/platform/hooks.go: add"message_display": "MessageDisplay"(1:1, no gate), reusing the P1d Claude-wider convention.internal/platform/hooks_test.go: mapper + render coverage; stillok=falseon codex/cursor/copilot/antigravity (D2, no cross-platform inference).docs/HOOKS.md+docs/PLATFORM_DIRS_DOCS.md: add the row, flip the audit❌→✅, drop the stale "separately-routed" claim.platform-dirs-claude-message-displayfold-back → routed toloop-discipline-stop-hooks/fold-backs/.Verified:
go test ./internal/platformgreen;gofmt/go vetclean.2.
ci(obs): wire obs worker lcov into SonarCloudThe
obs/Cloudflare-worker package has tests but emitted no coverage, andsonar.javascript.lcov.reportPathspointed at no obs lcov — so everyobs/src/*.tsline read 0% on the merged scan (not untested, just unsignalled). Any obs-touching PR then fought the 80%new_coveragegate for lack of a report (seen on #503).obs/package.json: addc8;test:coverageemitsobs/coverage/lcov.info(--all --src=src, obs-relativeSF:paths matching how Sonar resolves the dashboard report).sonar-project.properties: addobs/coverage/lcov.infotosonar.javascript.lcov.reportPaths..github/workflows/test.yml: in the coverage-gate job, install obs deps (--ignore-scriptsper S6505 +rebuild esbuild) and runtest:coveragebefore the scan, mirroring the dashboard step.Verified locally:
npm ci --ignore-scripts && npm rebuild esbuild && npm run test:coverage→ 18 pass, lcov lists all 6obs/srcfiles with obs-relative paths. This PR touches no obssrc, sonew_coverageis unaffected; the scanner log on this run confirms Sonar resolves the new report.