Refine HyperTwist launch banner blocker detail
This commit is contained in:
parent
fa71d0728f
commit
7ab22106ee
4 changed files with 154 additions and 9 deletions
|
|
@ -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`)
|
||||
|
||||
|
|
|
|||
|
|
@ -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`
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue