Refine HyperTwist launch banner blocker detail

This commit is contained in:
axiomlogicnexus 2026-06-29 17:20:22 +00:00
parent fa71d0728f
commit 7ab22106ee
4 changed files with 154 additions and 9 deletions

View file

@ -1955,6 +1955,43 @@ Latest same-family responsive public-route expansion follow-up on `2026-06-29`:
- the browser launch-authority lane now matches the already-declared
server-owned contract more closely instead of merely being consistent with
it by coincidence
- the always-visible marketing-shell status banner should not regress into
generic rollout prose when deeper launch-authority surfaces already know
the concrete blockers
- the compact banner continuation now also projects the first concrete live
auth-health or billing-runtime blockers plus a remaining-count summary,
while `/launch-status` and `/app/launch-status` still carry the full
blocker list
- the same-family verification loop then stayed green under:
- `npm --prefix website run type-check`
- `npm --prefix website test -- --run src/__tests__/PublicLaunchStatus.test.tsx src/__tests__/public-marketing-pages.test.tsx`
- `2` files passed
- `19` tests passed
- `scripts/run-hypertwist-web-surface-validation.sh`
- focused website route/auth/release validation: `14` files, `82` tests
passed
- website deployment/readiness tooling validation: `3` files, `30` tests
passed
- `website/server` validation: `10` files, `36` tests passed
- website plus `Content/Browser` production builds passed
- `website/` and `Content/Browser/` production audits stayed at
`found 0 vulnerabilities`
- `website/server/` again retained only the already-documented upstream
`supertokens-node -> nodemailer` residual advisory
- `scripts/run-hypertwist-sentrux-source-only.sh`
- `Quality: 6234`
- all `7` rules passing
- `scripts/run-hypertwist-gitnexus-analyze.sh`
- retained local runtime again fell back truthfully to
`npx gitnexus@latest` on this Linux host because of the known
`invalid ELF header` `LadybugDB` mismatch
- bounded mirror refreshed at:
- `16,406` nodes
- `38,773` edges
- `677` clusters
- `300` flows
- `scripts/run-hypertwist-gitnexus-status.sh`
- bounded mirror `Status: up-to-date`
## Latest shared public-manual helper consolidation follow-up (`2026-06-29`)

View file

@ -636,6 +636,13 @@ also passed the full frontend `npm test` suite and a fresh `npm run build`
after an older auth-page mock was widened to include the new shared
`getAuthHealth` dependency used by the marketing shell.
The later launch-summary continuity refinement on `2026-06-29` then also kept
that always-visible marketing-shell banner from drifting back into generic
missing-label prose: when the live site is still in preview posture, the banner
now names the first concrete auth-health or billing-runtime blockers and a
remaining-count summary, while the deeper `/launch-status` surfaces still carry
the full blocker list.
The follow-on public-manual widening on `2026-06-22` then also passed:
- `npm run type-check`

View file

@ -10,9 +10,9 @@ vi.mock('../auth/auth-api', () => ({
getAuthHealth: (...args: unknown[]) => mockGetAuthHealth(...args),
}))
import { PublicLaunchStatus } from '../components/ui/PublicLaunchStatus'
import { MarketingLaunchStatusBanner, PublicLaunchStatus } from '../components/ui/PublicLaunchStatus'
function renderComponent() {
function renderComponent(element: React.ReactNode = <PublicLaunchStatus />) {
const queryClient = new QueryClient({
defaultOptions: {
queries: {
@ -24,7 +24,7 @@ function renderComponent() {
return render(
<QueryClientProvider client={queryClient}>
<MemoryRouter future={ROUTER_FUTURE_FLAGS}>
<PublicLaunchStatus />
{element}
</MemoryRouter>
</QueryClientProvider>,
)
@ -122,6 +122,85 @@ describe('PublicLaunchStatus', () => {
expect(screen.getByText('Runtime warning: SUPERTOKENS_CORE_URI still targets a loopback/local-development host.')).toBeTruthy()
})
it('keeps the marketing banner compact while still surfacing concrete live blockers', async () => {
mockGetAuthHealth.mockResolvedValue({
ok: true,
service: 'hypertwist-auth-server',
supertokens: {
configured: true,
reachable: true,
ready: false,
apiVersion: '5.4',
error: null,
oauth: {
github: true,
google: false,
orcid: true,
},
},
fallback: {
enabled: true,
active: false,
reason: null,
},
billing: {
statePath: '/tmp/hypertwist-billing.json',
processedEventCount: 0,
pricePlanMapConfigured: false,
productPlanMapConfigured: false,
webhookSecretConfigured: false,
},
runtime: {
mode: 'mixed',
public_origin_ready: true,
cookie_secure: true,
api_domain: 'https://hypertwist.app',
website_domain: 'https://hypertwist.app',
warnings: [],
errors: [],
},
launch: {
posture: 'preview',
ready: false,
readiness: {
windowsDownloadConfigured: true,
macosDownloadConfigured: false,
linuxDownloadConfigured: false,
operatorCheckoutConfigured: false,
studioCheckoutConfigured: false,
mplSourceConfigured: true,
openSourceRepoConfigured: true,
billingProductPlanMapConfigured: false,
billingPricePlanMapConfigured: false,
billingWebhookSecretConfigured: false,
publicAuthRuntimeReady: false,
},
checklist: [
{
id: 'windows-download',
label: 'Windows release authority',
configured: true,
requiredForPublicLaunch: true,
},
],
missingLabels: ['operator checkout URL', 'studio checkout URL'],
targets: {
operatorCheckoutTarget: null,
studioCheckoutTarget: null,
},
},
})
renderComponent(<MarketingLaunchStatusBanner />)
await waitFor(() => {
expect(screen.getByText(/Live preview lane: Operator checkout is still on support fallback/i)).toBeTruthy()
})
expect(screen.getByText(/Studio checkout is still on support fallback/i)).toBeTruthy()
expect(screen.getByText(/4 more live blockers remain on the deployment/i)).toBeTruthy()
})
it('omits the blocker section when the live launch posture is ready and warning-free', async () => {
mockGetAuthHealth.mockResolvedValue({
ok: true,

View file

@ -6,6 +6,32 @@ import { buildLiveLaunchBlockerDetails, resolvePublicLaunchStatusSummary } from
import { launchReadiness } from '../../site-config'
import { buildProtectedDownloadPath } from '../../site-routes'
function buildMarketingLaunchStatusSummary(
ready: boolean,
liveBlockerDetails: string[],
missingLabels: string[],
) {
if (ready) {
return 'Checkout, release, notices, and live auth-runtime posture are aligned for the current public lane.'
}
if (liveBlockerDetails.length > 0) {
const featuredBlockers = liveBlockerDetails.slice(0, 2)
const remainingBlockerCount = liveBlockerDetails.length - featuredBlockers.length
const remainingBlockerLine = remainingBlockerCount > 0
? ` ${remainingBlockerCount} more live blocker${remainingBlockerCount === 1 ? '' : 's'} remain on the deployment.`
: ''
return `Live preview lane: ${featuredBlockers.join(' ')}${remainingBlockerLine}`
}
if (missingLabels.length > 0) {
return `Live preview lane: remaining launch blockers are ${missingLabels.join(', ')}.`
}
return 'Live preview lane: rollout configuration is still incomplete on the current deployment.'
}
function usePublicLaunchStatus() {
const authHealthQuery = useQuery({
queryKey: ['auth-health', 'public-launch-status'],
@ -43,7 +69,7 @@ function usePublicLaunchStatus() {
}
export function MarketingLaunchStatusBanner() {
const { missingLabels, ready } = usePublicLaunchStatus()
const { liveBlockerDetails, missingLabels, ready } = usePublicLaunchStatus()
return (
<article className="callout site-status-banner">
@ -53,11 +79,7 @@ export function MarketingLaunchStatusBanner() {
</p>
<strong>Public site status</strong>
</div>
<p>
{ready
? 'Checkout, release, notices, and live auth-runtime posture are aligned for the current public lane.'
: `Live preview lane: remaining launch blockers are ${missingLabels.join(', ')}.`}
</p>
<p>{buildMarketingLaunchStatusSummary(ready, liveBlockerDetails, missingLabels)}</p>
<div className="status-row">
<Link className="inline-link" to="/launch-status">
View launch posture