Skip to content

fix: audit batch 11 — Q01,Q02,Q04,Q05,Q08,Q09,Q10,Q11,Q12 - #214

Merged
hermes-gadget merged 1 commit into
mainfrom
fix/audit-batch11
Sep 6, 2026
Merged

hermes-gadget merged 1 commit into
mainfrom
fix/audit-batch11

Conversation

@hermes-gadget

Copy link
Copy Markdown
Owner

Summary

Eleventh block of the 2026-09-05 GPT-6 audit (ROADMAP.md): 9 findings — the Q-family quality/consistency batch.

  • Q01 — scoped purge now covers cache_pending_pairing_ + sync_ namespaces; hashed agent-notification slots swept by 7-day retention.
  • Q02 — remote text editing: send expected_original (server conditional-write support when available) + post-write verification so a racing host edit surfaces as a conflict instead of a silent overwrite.
  • Q04 — shared terminal close-code classification (WsAuthHelper as single owner) used by both the sidecar client and PTY supervisor; 1009 message-too-big is terminal, ending PTY reconnect loops.
  • Q05 — new ActionOutcome typed adapter; {ok:false} 2xx bodies fail the flow at all four concrete ignored-body sites (memory save, review branch switch, plugins actions, MCP save).
  • Q08 — provider OAuth Start/Poll: typed decode accepted only when it captured a real identity field; camelCase/unsupported shapes fall through to the alias mapper (fixtures added).
  • Q09 — channels onboarding freezes the management profile at operation start; CommandCenter refresh gains a generation guard.
  • Q10 — dead MCP helper declarations removed (one transaction owner); plugins dashboard loads parallelized.
  • Q11 — unused quadratic LCS renderLineDiff removed with its tests; production uses renderUnifiedDiff.
  • Q12 — per-operation busy guards for webhook create, profile create, and system doctor/audit/backup (double-tap protection in state).

Test plan

  • New ActionOutcomeTest (4 tests) + ProviderParsing Q08 fixtures (3 tests).
  • Full suite: 594 tests, 0 failures.

Closes: #149, #150, #158, #152, #159, #153, #160, #161, #154

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

- Q01 (#149): purgeScopedKeys now covers cache_pending_pairing_ and
  sync_ namespaces, and stale hashed agent-notification slots (7-day
  retention) are swept so dead lanes cannot accumulate.
- Q02 (#150): fsWriteText narrows the preflight/write race — sends
  expected_original for servers with conditional-write support and
  verifies the content landed after the write, turning silent
  host-edit overwrite into a detectable conflict.
- Q04 (#158): terminal close codes owned by WsAuthHelper (single
  source) and shared by the sidecar client and PTY supervisor; 1009
  message-too-big is terminal for both, ending PTY reconnect loops on
  oversized frames.
- Q05 (#152): shared ActionOutcome typed adapter; {ok:false} on HTTP
  2xx now fails the flow at the four concrete ignored-body sites
  (memory config save, review branch switch, plugins actions, MCP
  save) — no success toast/cache mutation until semantic success.
- Q08 (#159): provider OAuth Start/Poll accept typed decode only when
  it captured a real identity field; camelCase/unsupported shapes fall
  through to the alias mapper instead of decoding to blank defaults
  (fixtures added).
- Q09 (#153): channels onboarding freezes the management profile at
  operation start; CommandCenter refresh gains a generation guard.
- Q10 (#160): removed dead MCP_AUTH_MODES/mcpConfigWriteMutex
  duplicates in McpScreenHelpers (one transaction owner in McpScreen);
  plugins dashboard loads now actually run in parallel.
- Q11 (#161): removed the unused quadratic LCS renderLineDiff (and its
  tests) — production uses renderUnifiedDiff.
- Q12 (#154): explicit per-operation busy guards for webhook create,
  profile create, and system doctor/audit/backup jobs (non-idempotent
  double-tap protection in state, not just composition).

Regression tests: ActionOutcomeTest (Q05, 4 tests), ProviderParsing
Q08 fixtures (3 tests). Full suite: 594 tests, 0 failures.
@hermes-gadget
hermes-gadget merged commit 6919159 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