diff --git a/apps/gittensory-ui/public/sitemap.xml b/apps/gittensory-ui/public/sitemap.xml index 026d36b418..769cdd5267 100644 --- a/apps/gittensory-ui/public/sitemap.xml +++ b/apps/gittensory-ui/public/sitemap.xml @@ -7,6 +7,7 @@ https://gittensory.aethereal.dev/extension https://gittensory.aethereal.dev/roadmap https://gittensory.aethereal.dev/docs + https://gittensory.aethereal.dev/docs/beta-onboarding https://gittensory.aethereal.dev/docs/quickstart https://gittensory.aethereal.dev/docs/mcp-clients https://gittensory.aethereal.dev/docs/miner-workflow diff --git a/apps/gittensory-ui/src/components/site/command-palette.tsx b/apps/gittensory-ui/src/components/site/command-palette.tsx index f95a28ae09..4b428873f2 100644 --- a/apps/gittensory-ui/src/components/site/command-palette.tsx +++ b/apps/gittensory-ui/src/components/site/command-palette.tsx @@ -27,6 +27,7 @@ const DEFAULT_ITEMS: PaletteItem[] = [ { label: "Product analytics", to: "/app/analytics", group: "App" }, { label: "Maintainer digest", to: "/app/digest", group: "App" }, { label: "Operator dashboard", to: "/app/operator", group: "App" }, + { label: "Beta onboarding", to: "/docs/beta-onboarding", group: "Docs" }, { label: "Quickstart", to: "/docs/quickstart", group: "Docs" }, { label: "MCP clients", to: "/docs/mcp-clients", group: "Docs" }, { label: "Miner workflow", to: "/docs/miner-workflow", group: "Docs" }, diff --git a/apps/gittensory-ui/src/components/site/docs-nav.tsx b/apps/gittensory-ui/src/components/site/docs-nav.tsx index ea4fe31e29..3e011f10b9 100644 --- a/apps/gittensory-ui/src/components/site/docs-nav.tsx +++ b/apps/gittensory-ui/src/components/site/docs-nav.tsx @@ -10,6 +10,7 @@ export const docsNav: DocsGroup[] = [ title: "Get started", items: [ { to: "/docs", label: "Overview" }, + { to: "/docs/beta-onboarding", label: "Beta onboarding" }, { to: "/docs/quickstart", label: "Quickstart" }, { to: "/docs/mcp-clients", label: "MCP client setup" }, ], diff --git a/apps/gittensory-ui/src/routeTree.gen.ts b/apps/gittensory-ui/src/routeTree.gen.ts index 09d8351146..38b93e1b4f 100644 --- a/apps/gittensory-ui/src/routeTree.gen.ts +++ b/apps/gittensory-ui/src/routeTree.gen.ts @@ -32,6 +32,7 @@ import { Route as DocsMcpClientsRouteImport } from './routes/docs.mcp-clients' import { Route as DocsMaintainerWorkflowRouteImport } from './routes/docs.maintainer-workflow' import { Route as DocsGithubAppRouteImport } from './routes/docs.github-app' import { Route as DocsBranchAnalysisRouteImport } from './routes/docs.branch-analysis' +import { Route as DocsBetaOnboardingRouteImport } from './routes/docs.beta-onboarding' import { Route as DocsAiSummariesRouteImport } from './routes/docs.ai-summaries' import { Route as AppWorkbenchRouteImport } from './routes/app.workbench' import { Route as AppRunsRouteImport } from './routes/app.runs' @@ -161,6 +162,11 @@ const DocsBranchAnalysisRoute = DocsBranchAnalysisRouteImport.update({ path: '/branch-analysis', getParentRoute: () => DocsRoute, } as any) +const DocsBetaOnboardingRoute = DocsBetaOnboardingRouteImport.update({ + id: '/beta-onboarding', + path: '/beta-onboarding', + getParentRoute: () => DocsRoute, +} as any) const DocsAiSummariesRoute = DocsAiSummariesRouteImport.update({ id: '/ai-summaries', path: '/ai-summaries', @@ -251,6 +257,7 @@ export interface FileRoutesByFullPath { '/app/runs': typeof AppRunsRoute '/app/workbench': typeof AppWorkbenchRoute '/docs/ai-summaries': typeof DocsAiSummariesRoute + '/docs/beta-onboarding': typeof DocsBetaOnboardingRoute '/docs/branch-analysis': typeof DocsBranchAnalysisRoute '/docs/github-app': typeof DocsGithubAppRoute '/docs/maintainer-workflow': typeof DocsMaintainerWorkflowRoute @@ -286,6 +293,7 @@ export interface FileRoutesByTo { '/app/runs': typeof AppRunsRoute '/app/workbench': typeof AppWorkbenchRoute '/docs/ai-summaries': typeof DocsAiSummariesRoute + '/docs/beta-onboarding': typeof DocsBetaOnboardingRoute '/docs/branch-analysis': typeof DocsBranchAnalysisRoute '/docs/github-app': typeof DocsGithubAppRoute '/docs/maintainer-workflow': typeof DocsMaintainerWorkflowRoute @@ -325,6 +333,7 @@ export interface FileRoutesById { '/app/runs': typeof AppRunsRoute '/app/workbench': typeof AppWorkbenchRoute '/docs/ai-summaries': typeof DocsAiSummariesRoute + '/docs/beta-onboarding': typeof DocsBetaOnboardingRoute '/docs/branch-analysis': typeof DocsBranchAnalysisRoute '/docs/github-app': typeof DocsGithubAppRoute '/docs/maintainer-workflow': typeof DocsMaintainerWorkflowRoute @@ -365,6 +374,7 @@ export interface FileRouteTypes { | '/app/runs' | '/app/workbench' | '/docs/ai-summaries' + | '/docs/beta-onboarding' | '/docs/branch-analysis' | '/docs/github-app' | '/docs/maintainer-workflow' @@ -400,6 +410,7 @@ export interface FileRouteTypes { | '/app/runs' | '/app/workbench' | '/docs/ai-summaries' + | '/docs/beta-onboarding' | '/docs/branch-analysis' | '/docs/github-app' | '/docs/maintainer-workflow' @@ -438,6 +449,7 @@ export interface FileRouteTypes { | '/app/runs' | '/app/workbench' | '/docs/ai-summaries' + | '/docs/beta-onboarding' | '/docs/branch-analysis' | '/docs/github-app' | '/docs/maintainer-workflow' @@ -629,6 +641,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof DocsBranchAnalysisRouteImport parentRoute: typeof DocsRoute } + '/docs/beta-onboarding': { + id: '/docs/beta-onboarding' + path: '/beta-onboarding' + fullPath: '/docs/beta-onboarding' + preLoaderRoute: typeof DocsBetaOnboardingRouteImport + parentRoute: typeof DocsRoute + } '/docs/ai-summaries': { id: '/docs/ai-summaries' path: '/ai-summaries' @@ -769,6 +788,7 @@ const AppRouteWithChildren = AppRoute._addFileChildren(AppRouteChildren) interface DocsRouteChildren { DocsAiSummariesRoute: typeof DocsAiSummariesRoute + DocsBetaOnboardingRoute: typeof DocsBetaOnboardingRoute DocsBranchAnalysisRoute: typeof DocsBranchAnalysisRoute DocsGithubAppRoute: typeof DocsGithubAppRoute DocsMaintainerWorkflowRoute: typeof DocsMaintainerWorkflowRoute @@ -784,6 +804,7 @@ interface DocsRouteChildren { const DocsRouteChildren: DocsRouteChildren = { DocsAiSummariesRoute: DocsAiSummariesRoute, + DocsBetaOnboardingRoute: DocsBetaOnboardingRoute, DocsBranchAnalysisRoute: DocsBranchAnalysisRoute, DocsGithubAppRoute: DocsGithubAppRoute, DocsMaintainerWorkflowRoute: DocsMaintainerWorkflowRoute, diff --git a/apps/gittensory-ui/src/routes/docs.beta-onboarding.tsx b/apps/gittensory-ui/src/routes/docs.beta-onboarding.tsx new file mode 100644 index 0000000000..0c57f545d0 --- /dev/null +++ b/apps/gittensory-ui/src/routes/docs.beta-onboarding.tsx @@ -0,0 +1,253 @@ +import { createFileRoute, Link } from "@tanstack/react-router"; + +import { DocsPage } from "@/components/site/docs-page"; +import { CodeBlock, Callout } from "@/components/site/primitives"; + +export const Route = createFileRoute("/docs/beta-onboarding")({ + head: () => ({ + meta: [ + { title: "Beta onboarding — Gittensory docs" }, + { + name: "description", + content: + "Role-based beta paths for miners, maintainers, repo owners, and operators — first useful action, not just API reference.", + }, + { property: "og:title", content: "Beta onboarding — Gittensory docs" }, + { + property: "og:description", + content: + "Role-based beta paths for miners, maintainers, repo owners, and operators — first useful action, not just API reference.", + }, + { property: "og:url", content: "/docs/beta-onboarding" }, + ], + links: [{ rel: "canonical", href: "/docs/beta-onboarding" }], + }), + component: BetaOnboarding, +}); + +function BetaOnboarding() { + return ( + + + Product positioning. Gittensory is a deterministic base-agent and + control-plane layer for the Gittensor ecosystem. It is{" "} + + jsonbored/gittensory + + , independent of{" "} + + entrius/gittensor + + . Use it to plan work, preflight branches, and keep GitHub review surfaces quiet — not as an + official Gittensor frontend, wallet UI, or payout dashboard. + + +

Miner journey

+

+ Miners and contributors use the local MCP package. Metadata stays on your machine; private + scoreability and blockers appear only in authenticated MCP/API responses. +

+
    +
  1. + Install the MCP. Global install or npx — see{" "} + Quickstart. + +
  2. +
  3. + Sign in. GitHub Device Flow — no PAT storage. + +
  4. +
  5. + Run diagnostics. Confirms API reachability, auth, source-upload posture, + and optional local score-preview wiring. + +
  6. +
  7. + Plan next work. Ranked actions, lane context, and blockers — + copilot-only; does not open PRs or post comments. + +
  8. +
  9. + Preflight the branch. Branch blockers, queue pressure, and maintainer-fit + notes before you push. + +
  10. +
  11. + Prepare a public-safe packet. Maintainer-readable PR description with no + private scoring language. + +
  12. +
+

+ Wire the same tools into Codex, Claude Desktop, or Cursor via{" "} + MCP client setup. Signed-in miners can also use the{" "} + Workbench and Miner dashboard{" "} + in the control panel. +

+ +

Maintainer journey

+

+ Maintainers install the GitHub App, configure per-repo policy, preview what could appear on + a confirmed-miner PR, then pull context on demand. +

+
    +
  1. + Install the GitHub App. Choose repositories and approve permissions — + default posture is silence. See GitHub App setup. +
  2. +
  3. + Configure settings. Opt in to at most one configured label and one sticky + sanitized comment per confirmed-miner PR. Tune repo policy in installation settings or via + the API. +
  4. +
  5. + Preview the public surface. Dry-run what would be written to GitHub + without mutating state. + +

    + The signed-in Maintainer console and{" "} + Repos tab surface the same preview diff when live data is + available. +

    +
  6. +
  7. + Use maintainer commands. On-demand context in the PR thread — output + stays maintainer-scoped when appropriate. + +
  8. +
+

+ Deeper workflow: Maintainer workflow. Privacy + rules: Privacy & security. +

+ +

Repo owner journey

+

+ Repo owners care about registration readiness and sensible .gittensor.yml{" "} + configuration before promoting labels or maintainer-cut policy. +

+
    +
  1. + Run a readiness report. Blockers, warnings, recommended registration + mode, and issue policy — private API only. + +
  2. +
  3. + Review config guidance. Recommended config diff with reasons and + tradeoffs — apply via PR when ready. + +
  4. +
  5. + Use the control panel. Open Repository owner{" "} + (or the Owner tab under Repos) to inspect the same signals + with a live repo selector after you sign in with GitHub. +
  6. +
+

+ Readiness is separate from upstream drift: a repo can look ready while Gittensor rules are + stale. Check Upstream drift when you change scoring + assumptions. +

+ +

Operator journey

+

+ Operators watch deployment health, product usage, value rollups, and upstream drift across + installations. These surfaces are private and authenticated — never mirrored to public + GitHub comments. +

+
    +
  1. + Open usage & value. Weekly rollups, activation status, and + noise-reduction metrics in the control panel. +

    + Operator dashboard — backed by{" "} + GET /v1/app/operator-dashboard. +

    +
  2. +
  3. + Read the weekly value report. Summary lines plus rollup freshness and + warnings when backfills lag or fidelity degrades. +
  4. +
  5. + Check drift status. Compare ruleset snapshots and signal fidelity before + trusting miner or maintainer guidance. + +
  6. +
+

+ When drift is not current, treat MCP and API responses as tied to the printed + ruleset version. See Upstream drift for semantics. +

+ +

Public vs private boundaries

+

+ Public GitHub output must never include wallets, hotkeys, payout or reward estimates, raw + trust scores, public score estimates, private reviewability details, or farming language. + Private MCP, API, and control-panel surfaces may show authenticated scoreability, blockers, + projections, and evidence — framed as guidance, not guaranteed outcomes. +

+ + If you are unsure whether copy belongs on a PR thread, start with a maintainer packet or MCP + preflight. Public comments stay advisory and sanitized; richer context stays in private + channels. + + +

Next steps

+ +
+ ); +} diff --git a/apps/gittensory-ui/src/routes/docs.index.tsx b/apps/gittensory-ui/src/routes/docs.index.tsx index 93c65c7df6..d8f09e3db9 100644 --- a/apps/gittensory-ui/src/routes/docs.index.tsx +++ b/apps/gittensory-ui/src/routes/docs.index.tsx @@ -1,5 +1,5 @@ import { createFileRoute, Link } from "@tanstack/react-router"; -import { ArrowRight, Bot, Building2, Compass, Shield } from "lucide-react"; +import { ArrowRight, Bot, Building2, Compass, Gauge, Shield } from "lucide-react"; import type { ReactNode } from "react"; import { DocsPage } from "@/components/site/docs-page"; @@ -31,7 +31,7 @@ function DocsIndex() {
{AUDIENCES.map((a) => ( @@ -55,8 +55,9 @@ const AUDIENCES: Audience[] = [ icon: , title: "Miners", description: "Plan better work, preflight branches, prepare PR packets.", - primary: { to: "/docs/quickstart", label: "Quickstart" }, + primary: { to: "/docs/beta-onboarding", label: "Beta onboarding" }, links: [ + { to: "/docs/quickstart", label: "Quickstart" }, { to: "/docs/miner-workflow", label: "Miner workflow" }, { to: "/docs/branch-analysis", label: "Branch analysis" }, { to: "/docs/scoreability", label: "Scoreability" }, @@ -66,8 +67,9 @@ const AUDIENCES: Audience[] = [ icon: , title: "Maintainers", description: "Confirmed-miner context, sanitized comments, no noisy checks.", - primary: { to: "/docs/github-app", label: "Install the GitHub App" }, + primary: { to: "/docs/beta-onboarding", label: "Beta onboarding" }, links: [ + { to: "/docs/github-app", label: "Install the GitHub App" }, { to: "/docs/maintainer-workflow", label: "Maintainer workflow" }, { to: "/docs/upstream-drift", label: "Upstream drift" }, { to: "/docs/ai-summaries", label: "AI summaries policy" }, @@ -77,12 +79,24 @@ const AUDIENCES: Audience[] = [ icon: , title: "Repo owners", description: "Registration readiness, label policy, repo settings preview.", - primary: { to: "/docs/github-app", label: "App install + scopes" }, + primary: { to: "/docs/beta-onboarding", label: "Beta onboarding" }, links: [ + { to: "/app/owner", label: "Owner console" }, { to: "/docs/privacy-security", label: "Privacy & security" }, { to: "/docs/troubleshooting", label: "Troubleshooting" }, ], }, + { + icon: , + title: "Operators", + description: "Usage rollups, weekly value report, upstream drift across deployments.", + primary: { to: "/docs/beta-onboarding", label: "Beta onboarding" }, + links: [ + { to: "/app/operator", label: "Operator dashboard" }, + { to: "/docs/upstream-drift", label: "Upstream drift" }, + { to: "/docs/troubleshooting", label: "Troubleshooting" }, + ], + }, { icon: , title: "Agent authors", diff --git a/apps/gittensory-ui/src/routes/docs.quickstart.tsx b/apps/gittensory-ui/src/routes/docs.quickstart.tsx index 826cf97d2d..e2ed31669b 100644 --- a/apps/gittensory-ui/src/routes/docs.quickstart.tsx +++ b/apps/gittensory-ui/src/routes/docs.quickstart.tsx @@ -71,7 +71,9 @@ gittensory-mcp preflight --login your-login --json`}

4. Wire it into your coding agent

Print a config snippet for your editor of choice and paste it in. See{" "} - MCP client setup for the details. + MCP client setup for the details. For the full miner path + (plan → preflight → packet) and other roles, see{" "} + Beta onboarding.

{ + const source = readFileSync(BETA_ONBOARDING_PATH, "utf8"); + + it("documents miner MCP flow through packet", () => { + expect(source).toMatch(/gittensory-mcp login/); + expect(source).toMatch(/gittensory-mcp doctor/); + expect(source).toMatch(/agent plan/); + expect(source).toMatch(/preflight/); + expect(source).toMatch(/agent packet/); + }); + + it("documents maintainer GitHub App setup, preview, and commands", () => { + expect(source).toMatch(/GitHub App/); + expect(source).toMatch(/settings-preview/); + expect(source).toMatch(/@gittensory help/); + expect(source).toMatch(/@gittensory preflight/); + }); + + it("documents repo owner readiness and config guidance", () => { + expect(source).toMatch(/registration-readiness/); + expect(source).toMatch(/gittensor-config-recommendation/); + expect(source).toMatch(/\/app\/owner/); + }); + + it("documents operator usage, value, and drift reporting", () => { + expect(source).toMatch(/operator-dashboard/); + expect(source).toMatch(/weekly value report/i); + expect(source).toMatch(/upstream\/drift/); + }); + + it("positions Gittensory as independent control-plane, not official Gittensor frontend", () => { + expect(source).toMatch(/official Gittensor product surface/i); + expect(source).toMatch(/official Gittensor frontend/i); + expect(source).toMatch(/independent of/i); + expect(source).toMatch(/base-agent/i); + expect(source).not.toMatch(/the official Gittensor frontend/i); + }); +});