diff --git a/docs/ops/HYPERTWIST_PUBLIC_WEBSITE_CONTENT_AND_OPERATOR_MANUAL_PACKET_2026-06-22.md b/docs/ops/HYPERTWIST_PUBLIC_WEBSITE_CONTENT_AND_OPERATOR_MANUAL_PACKET_2026-06-22.md index 3ae8e72..b68d439 100644 --- a/docs/ops/HYPERTWIST_PUBLIC_WEBSITE_CONTENT_AND_OPERATOR_MANUAL_PACKET_2026-06-22.md +++ b/docs/ops/HYPERTWIST_PUBLIC_WEBSITE_CONTENT_AND_OPERATOR_MANUAL_PACKET_2026-06-22.md @@ -246,6 +246,45 @@ Latest authority-sync follow-up later on `2026-06-23`: - XR groundwork exists, but finished XR/preferences ownership is still a later native packet +Latest same-family public-manual follow-up on `2026-06-24`: + +- the public and protected manual no longer make readers reconstruct product + topology from separate card grids alone +- a new shared product-surface authority matrix now keeps five distinct + surfaces visible across the homepage, feature atlas, public docs, and the + protected dashboard: + - public website + - protected browser dashboard + - embedded simulator browser shell + - native Unreal desktop runtime + - optional full-browser simulator branch +- that matrix now makes two easy-to-confuse truths materially clearer: + - the public website and the embedded browser shell are not the same thing + - the embedded browser shell and the frozen optional full-browser simulator + branch are not the same thing +- the protected dashboard therefore now carries the same topology/ownership map + as the public manual instead of relying on operator memory after sign-in +- focused validation for that matrix and protected-dashboard continuation then + stayed green under: + - `npm --prefix website test -- --run src/__tests__/public-marketing-pages.test.tsx src/__tests__/protected-app-pages.test.tsx src/__tests__/DashboardOverviewPage.test.tsx src/__tests__/app-route-tree.test.tsx` + - `4` test files passed + - `30` tests passed +- the broader current website/runtime/server umbrella then also stayed green + again under: + - `scripts/run-hypertwist-web-surface-validation.sh` + - focused website route/auth/release validation: `12` test files passed, + `61` tests passed + - `npm --prefix website run build` + - `npm --prefix website/server run type-check` + - `npm --prefix website/server test -- --run` + - `10` website/server test files passed, `36` tests passed + - `npm --prefix Content/Browser run verify:shell` + - `npm --prefix Content/Browser run build` + - website and `Content/Browser` production audits stayed at + `found 0 vulnerabilities` + - website/server still retained only the already-documented upstream + `supertokens-node -> nodemailer` residual + Latest protected-surface resilience follow-up later on `2026-06-23`: - the shared release-manifest fallback was tightened so protected browser diff --git a/docs/ops/HYPERTWIST_REFACTORING_TOOLCHAIN_2026-06-22.md b/docs/ops/HYPERTWIST_REFACTORING_TOOLCHAIN_2026-06-22.md index 2e78564..55f33e8 100644 --- a/docs/ops/HYPERTWIST_REFACTORING_TOOLCHAIN_2026-06-22.md +++ b/docs/ops/HYPERTWIST_REFACTORING_TOOLCHAIN_2026-06-22.md @@ -58,8 +58,8 @@ Resolution order for the analyzer binary is now HyperTwist-owned first: - `HYPERTWIST_SENTRUX_BINARY` if explicitly provided - repo-local `./sentrux` or `./sentrux.exe` if present - repo-local `tools/sentrux/bin/sentrux` or `tools/sentrux/bin/sentrux.exe` +- auto-bootstrap through `scripts/bootstrap-hypertwist-sentrux.sh --if-missing` - `sentrux` on `PATH` -- the retained local fallback under `/home/dev/src/VectorShell/sentrux` If the repo-local tools path is empty, materialize it with: @@ -67,6 +67,10 @@ If the repo-local tools path is empty, materialize it with: scripts/bootstrap-hypertwist-sentrux.sh ``` +That bootstrap may still use retained sibling-repo seeds when necessary, but +the ordinary HyperTwist wrapper no longer needs to execute directly from those +repos once the local landing zone exists. + Current rules enforce: - no cycles @@ -599,6 +603,53 @@ Latest refactor-tooling follow-up later on `2026-06-23`: - `Quality: 6108` - all `7` checked rules passing +Latest wrapper-ownership follow-up on `2026-06-24`: + +- `scripts/bootstrap-hypertwist-sentrux.sh` now also accepts + `HYPERTWIST_SENTRUX_BINARY` as an explicit local seed +- `scripts/run-hypertwist-sentrux-source-only.sh` now attempts repo-local + bootstrap before it falls back to `PATH` +- sibling-repo `VectorShell` and `ScriptoriumAI` `sentrux` artifacts are now + treated as bootstrap seeds rather than the normal direct runtime path for the + HyperTwist analyzer wrapper +- this keeps the toolchain more honestly HyperTwist-local after the first + materialization without changing the bounded analysis scope + +Latest same-day validation follow-up later on `2026-06-24`: + +- the wrapper and public-manual continuation were then revalidated together on + the current host instead of being left as a docs-only claim +- focused website coverage for the shared product-surface matrix and protected + dashboard continuation stayed green under: + - `npm --prefix website test -- --run src/__tests__/public-marketing-pages.test.tsx src/__tests__/protected-app-pages.test.tsx src/__tests__/DashboardOverviewPage.test.tsx src/__tests__/app-route-tree.test.tsx` + - `4` test files passed + - `30` tests passed +- the broader current web-surface umbrella then stayed green under: + - `scripts/run-hypertwist-web-surface-validation.sh` + - focused website route/auth/release validation: `12` test files passed, + `61` tests passed + - website/server tests: `10` test files passed, `36` tests passed + - website plus `Content/Browser` production audits: `found 0 vulnerabilities` + - website/server retained only the already-documented upstream + `supertokens-node -> nodemailer` residual +- `scripts/run-hypertwist-sentrux-source-only.sh` then improved again to: + - `Quality: 6135` + - all `7` checked rules passing +- `scripts/run-hypertwist-gitnexus-analyze.sh` then re-indexed the bounded + source-only mirror successfully at: + - `16,159` nodes + - `37,724` edges + - `666` clusters + - `300` flows + - fallback completion time `84.7s` +- the wrapper again rejected the broken retained local GitNexus CLI cleanly + first, then completed through `npx -y gitnexus@latest` instead of yielding a + false local success +- `scripts/run-hypertwist-gitnexus-status.sh` then again reported: + - `Indexed commit: ccbc988` + - `Current commit: ccbc988` + - `Status: up-to-date` + ## Out of scope This note does not: diff --git a/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md b/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md index 75e1a52..ad48265 100644 --- a/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md +++ b/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md @@ -51,7 +51,16 @@ Use them with this posture: `CHANGELOG.md` - `scripts/run-hypertwist-sentrux-source-only.sh` now prefers a HyperTwist owned entry path first: `HYPERTWIST_SENTRUX_BINARY`, repo-local `./sentrux` - or `./sentrux.exe`, then `PATH`, then the retained fallback + or `./sentrux.exe`, then repo-local `tools/sentrux/bin/`, then a bootstrap + attempt, then `PATH` +- the current `2026-06-24` wrapper hardening tightens that posture further: + - the source-only wrapper now auto-attempts + `scripts/bootstrap-hypertwist-sentrux.sh --if-missing` before it gives up + - sibling-repo binaries are now bootstrap seeds rather than the normal direct + runtime path + - once bootstrapped, analyzer execution stays on the HyperTwist-local + `tools/sentrux/bin/` landing zone instead of reaching back into + `VectorShell` during ordinary runs Suggested loop: @@ -123,6 +132,49 @@ Current bounded refactor-tool truth after the `2026-06-24` follow-up: improved to `Quality: 6131` - no new structural debt was introduced by the route-registry and sitemap authority hardening packet +- the same-day wrapper hardening also improved repo-local ownership discipline: + - `scripts/bootstrap-hypertwist-sentrux.sh` now accepts + `HYPERTWIST_SENTRUX_BINARY` as an explicit seed + - `scripts/run-hypertwist-sentrux-source-only.sh` now prefers the + bootstrapped HyperTwist-local analyzer binary instead of directly executing + a sibling-repo fallback during ordinary runs + +Latest same-day follow-up later on `2026-06-24`: + +- the shared product-surface authority matrix landed across the homepage, + feature atlas, public docs, and protected dashboard without widening product + claims +- focused website coverage for that matrix plus the protected dashboard + continuation stayed green under: + - `npm --prefix website test -- --run src/__tests__/public-marketing-pages.test.tsx src/__tests__/protected-app-pages.test.tsx src/__tests__/DashboardOverviewPage.test.tsx src/__tests__/app-route-tree.test.tsx` + - `4` test files passed + - `30` tests passed +- the full current web-surface umbrella stayed green again under: + - `scripts/run-hypertwist-web-surface-validation.sh` + - focused website route/auth/release validation: `12` test files passed, + `61` tests passed + - `npm --prefix website run build` + - `npm --prefix website/server run type-check` + - `npm --prefix website/server test -- --run` + - `10` website/server test files passed, `36` tests passed + - `npm --prefix Content/Browser run verify:shell` + - `npm --prefix Content/Browser run build` + - website and `Content/Browser` production audits stayed at + `found 0 vulnerabilities` + - the documented upstream auth-server residual + `supertokens-node -> nodemailer` remained accepted in default mode +- `scripts/run-hypertwist-sentrux-source-only.sh` then improved again to: + - `Quality: 6135` + - all `7` rules passing +- `scripts/run-hypertwist-gitnexus-analyze.sh` then re-indexed the bounded + source-only mirror successfully at: + - `16,159` nodes + - `37,724` edges + - `666` clusters + - `300` flows + - fallback completion time `84.7s` +- `scripts/run-hypertwist-gitnexus-status.sh` then again reported the bounded + mirror `Status: up-to-date` ## Canonical development authorities diff --git a/scripts/bootstrap-hypertwist-sentrux.sh b/scripts/bootstrap-hypertwist-sentrux.sh index 97d72fa..0f88917 100644 --- a/scripts/bootstrap-hypertwist-sentrux.sh +++ b/scripts/bootstrap-hypertwist-sentrux.sh @@ -16,12 +16,16 @@ Usage: scripts/bootstrap-hypertwist-sentrux.sh [--if-missing] Materializes a repo-local sentrux binary under tools/sentrux/bin/ using the -best available retained source on this machine. +best available retained seed on this machine. Resolution order: - 1. existing VectorShell Linux build artifact - 2. local VectorShell source build via cargo - 3. local ScriptoriumAI Windows binary + 1. HYPERTWIST_SENTRUX_BINARY if explicitly provided + 2. existing VectorShell Linux build artifact + 3. local VectorShell source build via cargo + 4. local ScriptoriumAI Windows binary + +The resulting analyzer then lives under HyperTwist-owned tools/sentrux/bin/ +so later runs do not need to execute directly from sibling repos. EOF } @@ -50,6 +54,18 @@ elif [[ $# -gt 0 ]]; then exit 1 fi +if [[ -n "${HYPERTWIST_SENTRUX_BINARY:-}" && -x "${HYPERTWIST_SENTRUX_BINARY}" ]]; then + case "${HYPERTWIST_SENTRUX_BINARY}" in + *.exe) + copy_binary "${HYPERTWIST_SENTRUX_BINARY}" "$dest_windows" + ;; + *) + copy_binary "${HYPERTWIST_SENTRUX_BINARY}" "$dest_linux" + ;; + esac + exit 0 +fi + if [[ -x "$vector_sentrux_binary" ]]; then copy_binary "$vector_sentrux_binary" "$dest_linux" exit 0 @@ -72,6 +88,7 @@ cat >&2 </dev/null 2>&1 || true + fi + + if [[ -x "$repo_tools_sentrux_binary" ]]; then + printf '%s\n' "$repo_tools_sentrux_binary" + return 0 + fi + + if [[ -x "$repo_tools_sentrux_windows_binary" ]]; then + printf '%s\n' "$repo_tools_sentrux_windows_binary" + return 0 + fi + if command -v sentrux >/dev/null 2>&1; then printf 'sentrux\n' return 0 fi - if [[ -x "$local_sentrux_binary" ]]; then - printf '%s\n' "$local_sentrux_binary" - return 0 - fi - - if command -v cargo >/dev/null 2>&1 && [[ -f "$local_sentrux_manifest" ]]; then - printf 'cargo run --quiet --manifest-path %q --bin sentrux --\n' "$local_sentrux_manifest" - return 0 - fi - return 1 } sentrux_command="$(resolve_sentrux_command)" || { - echo "Unable to locate sentrux. Provide HYPERTWIST_SENTRUX_BINARY, run scripts/bootstrap-hypertwist-sentrux.sh, add sentrux to PATH, place a repo-local sentrux binary at $repo_root, or keep /home/dev/src/VectorShell/sentrux available." >&2 + echo "Unable to locate sentrux. Provide HYPERTWIST_SENTRUX_BINARY, run scripts/bootstrap-hypertwist-sentrux.sh, add sentrux to PATH, or place a repo-local sentrux binary under $repo_root/tools/sentrux/bin." >&2 exit 1 } diff --git a/tools/sentrux/README.md b/tools/sentrux/README.md index fec47ea..3e041d4 100644 --- a/tools/sentrux/README.md +++ b/tools/sentrux/README.md @@ -12,4 +12,8 @@ scripts/bootstrap-hypertwist-sentrux.sh ``` That helper materializes a local binary under `tools/sentrux/bin/` from the -best retained source available on this machine. +best retained seed available on this machine. + +The normal HyperTwist wrapper then prefers that repo-local binary before it +falls back to anything else, so analyzer execution stays HyperTwist-local after +bootstrap. diff --git a/website/src/__tests__/DashboardOverviewPage.test.tsx b/website/src/__tests__/DashboardOverviewPage.test.tsx index 1124962..5fc3b43 100644 --- a/website/src/__tests__/DashboardOverviewPage.test.tsx +++ b/website/src/__tests__/DashboardOverviewPage.test.tsx @@ -188,6 +188,8 @@ describe('DashboardOverviewPage', () => { expect(screen.getByText('Packaged validation passed')).toBeTruthy() expect(screen.getByText(/Magic120Cell dedicated-family training map: passed/i)).toBeTruthy() expect(screen.getByText('Desktop rollout follow-through')).toBeTruthy() + expect(screen.getByText('Current product-surface map')).toBeTruthy() + expect(screen.getByText('Embedded simulator browser shell')).toBeTruthy() expect(screen.getByText('Pair desktop access to the browser account')).toBeTruthy() const generateDesktopLinkButtons = screen.getAllByRole('button', { name: /generate desktop-link token/i }) diff --git a/website/src/__tests__/app-route-tree.test.tsx b/website/src/__tests__/app-route-tree.test.tsx index c50630c..9e4540a 100644 --- a/website/src/__tests__/app-route-tree.test.tsx +++ b/website/src/__tests__/app-route-tree.test.tsx @@ -256,6 +256,7 @@ describe('AppRouteTree', () => { renderRoute('/app') expect(await screen.findByText('HyperTwist dashboard')).toBeTruthy() expect(await screen.findByText('Account state')).toBeTruthy() + expect(screen.getByText('Current product-surface map')).toBeTruthy() }) it('renders the protected downloads route through the real route tree when authenticated', async () => { diff --git a/website/src/__tests__/public-marketing-pages.test.tsx b/website/src/__tests__/public-marketing-pages.test.tsx index 33c7d02..ef6bbe6 100644 --- a/website/src/__tests__/public-marketing-pages.test.tsx +++ b/website/src/__tests__/public-marketing-pages.test.tsx @@ -352,7 +352,7 @@ describe('public marketing pages', () => { expect(screen.getAllByText('Paddle webhook secret: missing').length).toBeGreaterThan(0) expect(screen.getByText('Public auth runtime posture: production-ready')).toBeTruthy() expect(screen.getByText('How a real first session flows')).toBeTruthy() - expect(screen.getByText('Why both browser and desktop stay')).toBeTruthy() + expect(screen.getAllByText('Current surface authority map').length).toBeGreaterThan(0) expect(screen.getAllByText('Native Unreal desktop runtime').length).toBeGreaterThan(0) }) @@ -469,6 +469,8 @@ describe('public marketing pages', () => { expect(screen.getByText('Feature truth without the roadmap archaeology.')).toBeTruthy() expect(screen.getByText('How to read the product truth')).toBeTruthy() expect(screen.getByText('Implemented now')).toBeTruthy() + expect(screen.getAllByText('Current surface authority map').length).toBeGreaterThan(0) + expect(screen.getAllByText('Embedded simulator browser shell').length).toBeGreaterThan(0) expect(screen.getByText('Current shipped capability')).toBeTruthy() expect(screen.getByText('Current public rollout posture')).toBeTruthy() expect(screen.getByText('Public feature and launch posture')).toBeTruthy() @@ -852,7 +854,9 @@ describe('public marketing pages', () => { renderWithProviders(, ['/docs']) expect(screen.getByText('Operator manual')).toBeTruthy() + expect(screen.getAllByText('Current surface authority map').length).toBeGreaterThan(0) expect(screen.getAllByText('1. Start in the browser shell').length).toBeGreaterThan(0) + expect(screen.getAllByText('Optional full-browser simulator branch').length).toBeGreaterThan(0) expect(screen.getByText('Simulator manual')).toBeTruthy() expect(screen.getByText('Higher-dimensional family guide')).toBeTruthy() expect(screen.getByText('Deployment readiness manual')).toBeTruthy() diff --git a/website/src/components/ui/ProductSurfaceMatrix.tsx b/website/src/components/ui/ProductSurfaceMatrix.tsx new file mode 100644 index 0000000..5336e9f --- /dev/null +++ b/website/src/components/ui/ProductSurfaceMatrix.tsx @@ -0,0 +1,40 @@ +import type { ProductSurfaceMatrixRow } from '../../site-data' + +export function ProductSurfaceMatrix({ + rows, +}: { + rows: readonly ProductSurfaceMatrixRow[] +}) { + return ( +
+ {rows.map((row) => ( +
+

{row.posture}

+
+

{row.title}

+

{row.description}

+
+
+

Owns today

+
    + {row.owns.map((item) => ( +
  • {item}
  • + ))} +
+
+
+

Does not claim

+
    + {row.doesNotClaim.map((item) => ( +
  • {item}
  • + ))} +
+
+

+ Use it next: {row.nextStep} +

+
+ ))} +
+ ) +} diff --git a/website/src/pages/app-pages.tsx b/website/src/pages/app-pages.tsx index 9eeb1f6..2c5d5cf 100644 --- a/website/src/pages/app-pages.tsx +++ b/website/src/pages/app-pages.tsx @@ -4,12 +4,13 @@ import { Link, useSearchParams } from 'react-router-dom' import { buildAuthApiBaseUrls, createDesktopLinkToken, getAuthHealth, getReleaseManifest } from '../auth/auth-api' import { usePlatformAuth, type PlatformUser } from '../auth/platform-auth' import { SiteMetadata } from '../components/seo/SiteMetadata' +import { ProductSurfaceMatrix } from '../components/ui/ProductSurfaceMatrix' import { ReleaseValidationSummary } from '../components/ui/ReleaseValidationSummary' import { resolvePublicLaunchStatusSummary } from '../public-launch' import { downloadTargets, launchReadiness, mplSourceUrl, openSourceRepoUrl, publicDocsUrl, releaseNotesUrl } from '../site-config' import { buildReleaseMetadataItems, resolveReleaseManifestView, type ReleaseManifestView } from '../release-manifest' import { buildSupportPath, getDownloadPlatformLabel, normalizeDownloadPlatform } from '../site-routes' -import { desktopDownloadSteps, desktopFirstLaunchCards, roadmapHonestyCards, supportEscalationCards } from '../site-data' +import { desktopDownloadSteps, desktopFirstLaunchCards, productSurfaceMatrixRows, roadmapHonestyCards, supportEscalationCards } from '../site-data' function Panel({ title, @@ -460,6 +461,16 @@ export function DashboardOverviewPage() { kicker="Post-download operator manual" /> + +

+ The protected dashboard is only one surface in the product. This shared map keeps account, + embedded-browser, desktop-runtime, and frozen-branch truth visible without forcing operators to reconstruct topology from separate pages. +

+
+ +
+
+
    {roadmapHonestyCards.map((item) => ( diff --git a/website/src/pages/public-pages-features.tsx b/website/src/pages/public-pages-features.tsx index d1be914..acafb23 100644 --- a/website/src/pages/public-pages-features.tsx +++ b/website/src/pages/public-pages-features.tsx @@ -2,13 +2,14 @@ import { Link } from 'react-router-dom' import { MarketingShell } from '../components/layout/MarketingShell' import { SiteMetadata } from '../components/seo/SiteMetadata' import { PublicLaunchStatus } from '../components/ui/PublicLaunchStatus' +import { ProductSurfaceMatrix } from '../components/ui/ProductSurfaceMatrix' import { - deliverySurfaceCards, deploymentReadinessTracks, featureAtlasCurrentTracks, featureRegistryTierCards, higherDimensionalRuntimeGuideCards, inputAndDevicePostureCards, + productSurfaceMatrixRows, releaseStoryCards, roadmapHonestyCards, } from '../site-data' @@ -66,22 +67,10 @@ export function FeaturesPage() {
    -
    - {deliverySurfaceCards.map((surface) => ( -
    -

    {surface.title}

    -

    {surface.description}

    -
      - {surface.bullets.map((bullet) => ( -
    • {bullet}
    • - ))} -
    -
    - ))} -
    +
    -
    - {deliverySurfaceCards.map((surface) => ( -
    -

    {surface.title}

    -

    {surface.description}

    -
      - {surface.bullets.map((bullet) => ( -
    • {bullet}
    • - ))} -
    -
    - ))} -
    +
    @@ -596,17 +586,10 @@ export function DocsPage() {
    -
    - {deliverySurfaceCards.map((surface) => ( -
    -

    {surface.title}

    -

    {surface.description}

    -
    - ))} -
    +
    *, .split-grid > *, +.surface-matrix > *, .panel-grid > * { flex: 1 1 280px; } @@ -447,6 +450,33 @@ img { border-color: var(--ht-border-strong); } +.surface-matrix__card { + display: grid; + gap: 0.9rem; +} + +.surface-matrix__section { + display: grid; + gap: 0.45rem; +} + +.surface-matrix__section h4 { + margin: 0; + color: var(--ht-cyan); + font-size: 0.82rem; + letter-spacing: 0.1em; + text-transform: uppercase; +} + +.surface-matrix__next { + margin: 0; + color: var(--ht-muted); +} + +.surface-matrix__next strong { + color: var(--ht-text); +} + .inline-link { display: inline-flex; align-items: center;