fix(bugbash-p3): instanode-web P3 sweep — a11y, favicon, nav/pricing drift, SSE, 429 hint#98
Merged
Merged
Conversation
…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>
This was referenced May 19, 2026
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.
BugBash P3 sweep — instanode-web
Covers every remaining
instanode-webfinding fromBUGHUNT-REPORT-2026-05-18.mdnot already handled by PR #96 (Wave D) or PR #97 (P2 wave). Branched offorigin/main(not off #96/#97).Findings fixed
:focus-visiblering:focus-visiblerule intokens.css(the one global stylesheet) — covers marketing, docs, dashboard. WCAG 2.4.7.favicon.ico404 / nosite.webmanifestpublic/favicon.ico+public/site.webmanifest;index.htmllinks both.<a href="">CTA + "talk to us" with no contact linkmailto:hello@instanode.dev.getResource()/credentialsfetch 400s for webhook/storage/queuedb/redis/mongovia a namedCREDENTIALED_RESOURCE_TYPESset.streamSSEdata:-no-space prefix dropped linesdata:per the SSE spec (single trailing space optional)..md-suffix inconsistencymarkdown.tsxnormalizeInternalHrefstrips a trailing.mdfrom internal links so/use-cases/x.mdresolves.Promise.all.catch()+ cancellation guard + an error banner, matching theResourcesPage/DeploymentsPageload pattern._headersno-op noteretryHint.tshelper 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'sAPIError.retryAfter).NEEDS DECISION
mkt-navvsPublicShell). 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)
PATCH /api/v1/deployments/:id404) — Wave 2 dedup confirmed this a stale false positive; the route is registered and the dashboard helper is correct. No change.Gates
npx tsc --noEmit— cleannpx vite build— cleannpx vitest run— 645 passed, 3 skipped, 0 failed (added markdown.md-strip cases +retryHintunit tests)🤖 Generated with Claude Code