Skip to content

fix(bugbash-p3): instanode-web P3 sweep — a11y, favicon, nav/pricing drift, SSE, 429 hint#98

Merged
mastermanas805 merged 2 commits into
mainfrom
fix/bugbash-p3-2026-05-18
May 19, 2026
Merged

fix(bugbash-p3): instanode-web P3 sweep — a11y, favicon, nav/pricing drift, SSE, 429 hint#98
mastermanas805 merged 2 commits into
mainfrom
fix/bugbash-p3-2026-05-18

Conversation

@mastermanas805
Copy link
Copy Markdown
Member

BugBash P3 sweep — instanode-web

Covers every remaining instanode-web finding from BUGHUNT-REPORT-2026-05-18.md not already handled by PR #96 (Wave D) or PR #97 (P2 wave). Branched off origin/main (not off #96/#97).

Findings fixed

Finding Fix
W3 T10 P3 — no global :focus-visible ring Single :focus-visible rule in tokens.css (the one global stylesheet) — covers marketing, docs, dashboard. WCAG 2.4.7.
W5 T10 P3favicon.ico 404 / no site.webmanifest Added public/favicon.ico + public/site.webmanifest; index.html links both.
P3-08 — Marketing Pro card "multi-env (dev/staging/prod + custom)" vs PricingPage "dev/staging/prod" Aligned the Marketing card to the honest "dev/staging/prod" framing.
P3-09 — Marketing Team card empty <a href=""> CTA + "talk to us" with no contact link Team CTA is now a disabled "Coming soon" pill; teaser links mailto:hello@instanode.dev.
P3-02getResource() /credentials fetch 400s for webhook/storage/queue Gated the fetch to db/redis/mongo via a named CREDENTIALED_RESOURCE_TYPES set.
W2 T10 P3streamSSE data:-no-space prefix dropped lines Matches data: per the SSE spec (single trailing space optional).
W2 T10 P3 — blog/use-case internal-link .md-suffix inconsistency markdown.tsx normalizeInternalHref strips a trailing .md from internal links so /use-cases/x.md resolves.
W3 T5 P3 — TeamPage unguarded Promise.all Added .catch() + cancellation guard + an error banner, matching the ResourcesPage/DeploymentsPage load pattern.
W5 T10 P3_headers no-op note Rewrote the comment to make unambiguous the file is a non-operational migration artifact on GitHub Pages.
P2 deferred as P3 — 429/Retry-After retry-loop UI New retryHint.ts helper renders a user-facing "retry in Ns" hint; wired into TeamPage's error banner. Reads the retry delay defensively (works with or without PR #97's APIError.retryAfter).

NEEDS DECISION

  • W5 T10 P3 — two drifting nav shells (MarketingPage bespoke mkt-nav vs PublicShell). Unifying them is a design/architecture refactor (the marketing nav is intentionally a distinct glassmorphic treatment with its own CSS), not a mechanical P3. Left untouched pending a product call on whether the two shells should converge.

Not re-fixed (in PR #96/#97)

Gates

  • npx tsc --noEmit — clean
  • npx vite build — clean
  • npx vitest run645 passed, 3 skipped, 0 failed (added markdown .md-strip cases + retryHint unit tests)

🤖 Generated with Claude Code

…drift, SSE, 429 hint

Covers every remaining instanode-web P3 finding from BUGHUNT-REPORT-2026-05-18
not already handled by PR #96 (Wave D) or PR #97 (P2 wave):

- Global :focus-visible ring in tokens.css — keyboard/AT users had no
  consistent focus indicator anywhere (W3 T10, WCAG 2.4.7).
- favicon.ico + site.webmanifest — browsers' implicit /favicon.ico
  request 404'd; no web manifest existed (W5 T10).
- P3-08: MarketingPage Pro card "multi-env (dev/staging/prod + custom)"
  drifted from PricingPage's "dev/staging/prod" — aligned to the honest
  framing.
- P3-09: MarketingPage Team card rendered an empty <a href=""> dead CTA
  pill and the "talk to us" teaser had no contact link — Team CTA now a
  disabled "Coming soon" pill, teaser links mailto:hello@instanode.dev.
- P3-02: getResource() fired a /credentials fetch that 400'd for
  webhook/storage/queue resources — gated to db/redis/mongo via a named
  CREDENTIALED_RESOURCE_TYPES set.
- streamSSE only matched `data: ` (with space); the SSE spec makes the
  space optional — no-space `data:` lines were silently dropped.
- markdown renderer: content-repo cross-links written as `/use-cases/x.md`
  hit the SPA catch-all and dead-ended on the homepage — normalizeInternalHref
  strips a trailing `.md` from internal links.
- TeamPage unguarded Promise.all — no .catch(), no cancellation guard;
  a failed load left the page silently empty. Now mirrors the
  ResourcesPage/DeploymentsPage load pattern with an error banner.
- _headers: rewrote the comment to make unambiguous that the file is a
  non-operational migration artifact on GitHub Pages.
- 429/Retry-After user-facing hint (P2 deferred as P3): new retryHint.ts
  helper turns the retry-delay into a human "retry in Ns" string; wired
  into TeamPage's error banner. Reads the delay defensively so it works
  with or without PR #97's APIError.retryAfter field.

Tests: markdown .md-strip cases, retryHint unit tests added.
Gates: tsc --noEmit clean · vite build clean · vitest 645 passed, 3 skipped, 0 failed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@mastermanas805 mastermanas805 merged commit dcbab30 into main May 19, 2026
2 checks passed
@mastermanas805 mastermanas805 deleted the fix/bugbash-p3-2026-05-18 branch May 19, 2026 03:14
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