Skip to content

fix: audit batch 8 — B02,B21,B63-B65,B67-B76,B78 with regression tests - #211

Merged
hermes-gadget merged 3 commits into
mainfrom
fix/audit-batch8
Sep 6, 2026
Merged

hermes-gadget merged 3 commits into
mainfrom
fix/audit-batch8

Conversation

@hermes-gadget

Copy link
Copy Markdown
Owner

Summary

Eighth block of the 2026-09-05 audit (ROADMAP.md): 17 findings fixed with regression tests. Covers the HIGH-severity B02 car notification bridge bypass plus notification, MCP, sessions, skills, system, voice, terminal, markdown, navigation, and manifest findings.

Findings

B02, B21, B63, B64, B65, B67, B68, B69, B70, B71, B72, B73, B74, B75, B76, B78

Test plan

  • MarkdownHighlightRangesTest (Unicode fold index safety), McpHeaderMergeTest (header merge), SessionExportFilenameTest (scope/attempt uniqueness) added.
  • Full suite: 569 tests, 0 failures.

Closes the matching audit issues (audit-2026-09-05 label).

Continues the 2026-09-05 GPT-6 audit (ROADMAP.md):

- B02: the car notification bridge can no longer bypass template authorization — mirrored notifications re-check host access after the async read and are withdrawn on trust loss; the reply PendingIntent is only added for action-capable hosts; car-bridge reply intents carry an origin marker and ReplyWorker drops them when no car host remains enrolled.
- B21: notification reply staging (spill mkdir/write) runs off the main thread inside a goAsync window; enqueue failure cleans the spill file; a shared enqueue path replaces the duplicated inline block.
- B63: MCP bearer rotation merges Authorization into the server's existing headers instead of replacing the whole object.
- B64: session export filenames carry an origin-scope digest and per-attempt timestamp — exports from different servers/profiles/attempts never overwrite each other.
- B65: post-delete reconciliation is best-effort — a confirmed delete is no longer reported as failed because the refresh hiccupped.
- B67: skill editor and toolset-config loads are generation-guarded — a delayed response can neither reopen a dismissed dialog nor clobber a newer one.
- B68: global System refresh no longer discards raw YAML drafts or in-flight saves (preserveDraft path).
- B69: provider metadata queries and share-chooser starts are failure-contained — SecurityException/ActivityNotFoundException degrade to messages, not crashes.
- B70: stopPlayback cancels the pending speech synthesis job, not just the player.
- B71: audio decode temp files are published at creation so cancellation between create and return can clean them up.
- B72: a socket-rejected terminal send keeps the command in the input and surfaces the error instead of silently clearing it.
- B73: cancelling an in-flight terminal backend load clears the orphaned loading flag so later loads aren't blocked.
- B74: markdown search highlighting folds per code point — expanding case mappings (İ, ß) no longer shift highlight indices off the original string.
- B75: scoped deep-link validation re-checks the expected scope after the suspending connection writes (check/use race).
- B76: oversized notification reply spill files survive retries — deletion deferred to terminal outcomes.
- B78: manifest declares a RecognitionService query so SpeechRecognizer binds under API 30+ package visibility.

Regression tests: MarkdownHighlightRangesTest, McpHeaderMergeTest, SessionExportFilenameTest.

Full suite: 569 tests, 0 failures.
@hermes-gadget
hermes-gadget merged commit a147e4d into main Sep 6, 2026
2 checks passed
This was referenced Sep 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant