Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 57 additions & 0 deletions site/src/layouts/RedirectLayout.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
---
// Standalone redirect stub for the retired augur site. The marketing and docs
// content now live on the CorvidLabs hub, so every route here meta-refreshes to
// its hub equivalent and declares the hub URL as canonical. Kept dependency-free
// (no Header/Footer/tokens) so it can't link back into the retired pages.
interface Props {
title: string
destination: string
}
const { title, destination } = Astro.props
---
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta http-equiv="refresh" content={`0; url=${destination}`} />
<link rel="canonical" href={destination} />
<meta name="robots" content="noindex, follow" />
<title>{title}</title>
<style>
:root { color-scheme: light dark; }
body {
margin: 0;
min-height: 100vh;
display: grid;
place-items: center;
font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
background: #0c0c0f;
color: #e7e7ea;
text-align: center;
padding: 24px;
}
main { max-width: 32rem; }
h1 { font-size: 1.5rem; margin: 0 0 0.75rem; letter-spacing: -0.01em; }
p { color: #a0a0a8; margin: 0 0 1.5rem; line-height: 1.5; }
a.moved {
display: inline-block;
font-weight: 600;
font-size: 1.05rem;
color: #0c0c0f;
background: #e7e7ea;
padding: 0.65rem 1.25rem;
border-radius: 0.5rem;
text-decoration: none;
}
a.moved:hover { background: #fff; }
</style>
</head>
<body>
<main>
<h1>This site has moved.</h1>
<p>The augur site now lives on the CorvidLabs hub. You're being redirected automatically.</p>
<a class="moved" href={destination}>This site has moved to CorvidLabs &rarr;</a>
</main>
</body>
</html>
3 changes: 3 additions & 0 deletions site/src/lib/hub.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// Destinations on the CorvidLabs hub that supersede this retired site.
export const HUB_MARKETING = 'https://corvidlabs.github.io/corvidlabs-site/augur/'
export const HUB_DOCS = 'https://corvidlabs.github.io/corvidlabs-site/augur/docs/'
19 changes: 3 additions & 16 deletions site/src/pages/404.astro
Original file line number Diff line number Diff line change
@@ -1,18 +1,5 @@
---
import BaseLayout from '../layouts/BaseLayout.astro'
import Button from '../components/Button.astro'
import { base } from '../lib/path'
import RedirectLayout from '../layouts/RedirectLayout.astro'
import { HUB_MARKETING } from '../lib/hub'
---
<BaseLayout title="404 · augur">
<main id="main" class="container" style="padding: 120px 0 80px; text-align: center;">
<p style="color: var(--accent-bright); font-family: var(--serif); font-style: italic; font-size: 1.25rem; margin-bottom: 8px;">404</p>
<h1 style="font-size: 2.4rem; letter-spacing: -0.02em; margin-bottom: 12px;">No verdict for this page.</h1>
<p style="color: var(--text-muted); font-size: 1.05rem; margin: 0 auto 28px; max-width: 480px;">
The page you're looking for doesn't exist. Try the docs or head back home.
</p>
<div style="display: flex; gap: 12px; justify-content: center; flex-wrap: wrap;">
<Button href={`${base}docs`} variant="primary">Read the docs</Button>
<Button href={base} variant="secondary">Back home</Button>
</div>
</main>
</BaseLayout>
<RedirectLayout title="augur has moved to CorvidLabs" destination={HUB_MARKETING} />
14 changes: 7 additions & 7 deletions site/src/pages/docs/[...slug].astro
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
---
import { getCollection } from 'astro:content'
import DocsLayout from '../../layouts/DocsLayout.astro'
import RedirectLayout from '../../layouts/RedirectLayout.astro'
import { HUB_DOCS } from '../../lib/hub'

export async function getStaticPaths() {
const entries = await getCollection('docs')
return entries
.filter(e => e.slug !== 'index')
.map(entry => ({ params: { slug: entry.slug }, props: { entry } }))
.map(entry => ({ params: { slug: entry.slug }, props: { slug: entry.slug } }))
}

const { entry } = Astro.props
const { Content } = await entry.render()
const { slug } = Astro.props
// Preserve deep links: map each retired doc slug to its hub docs equivalent.
const destination = `${HUB_DOCS}${slug}/`
---
<DocsLayout title={entry.data.title} description={entry.data.description} section={entry.data.section}>
<Content />
</DocsLayout>
<RedirectLayout title="augur docs have moved to CorvidLabs" destination={destination} />
11 changes: 3 additions & 8 deletions site/src/pages/docs/index.astro
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
---
import { getEntry } from 'astro:content'
import DocsLayout from '../../layouts/DocsLayout.astro'
const entry = await getEntry('docs', 'index')
if (!entry) throw new Error('docs/index entry not found')
const { Content } = await entry.render()
import RedirectLayout from '../../layouts/RedirectLayout.astro'
import { HUB_DOCS } from '../../lib/hub'
---
<DocsLayout title={entry.data.title} description={entry.data.description} section={entry.data.section}>
<Content />
</DocsLayout>
<RedirectLayout title="augur docs have moved to CorvidLabs" destination={HUB_DOCS} />
247 changes: 3 additions & 244 deletions site/src/pages/index.astro
Original file line number Diff line number Diff line change
@@ -1,246 +1,5 @@
---
import BaseLayout from '../layouts/BaseLayout.astro'
import Badge from '../components/Badge.astro'
import Button from '../components/Button.astro'
import Terminal from '../components/Terminal.astro'
import Verdict from '../components/Verdict.astro'
import Callout from '../components/Callout.astro'
import { base } from '../lib/path'
import fs from 'node:fs'
import path from 'node:path'
import { fileURLToPath } from 'node:url'

// Read the released version from the CHANGELOG at build time so the hero badge
// never drifts behind a release (same source as the header).
const changelog = fs.readFileSync(
path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../CHANGELOG.md'),
'utf-8',
)
const VERSION = `v${changelog.match(/##\s*\[v?([0-9][^\]\s]*)\]/)?.[1] ?? '0.0.0'}`

const signals = [
{ name: 'sensitivity', catches: 'Touches secrets, auth, crypto, payments, migrations, infra, CI, or dependency manifests.' },
{ name: 'test-gap', catches: 'Code changed with no test in the changeset, or, with coverage, the uncovered fraction of changed lines.' },
{ name: 'churn', catches: 'Hot files that change constantly are fragile.' },
{ name: 'coupling', catches: "A file's usual co-change partner is absent from the change." },
{ name: 'diff-shape', catches: 'Large single-file edits are harder to review.' },
{ name: 'ownership', catches: 'Bus-factor (single author) or diffuse ownership (many authors).' },
{ name: 'incident', catches: "The file's own history of reverts / hotfixes." },
{ name: 'codeowners', catches: "A changed file with no declared owner in the repo's CODEOWNERS." },
]
import RedirectLayout from '../layouts/RedirectLayout.astro'
import { HUB_MARKETING } from '../lib/hub'
---
<BaseLayout title="augur: graded trust for code changes">
<main id="main">

<section class="hero" aria-labelledby="hero-h">
<div class="container">
<div class="hero-grid">
<div>
<Badge dot>🔮 {VERSION} · no API key · no LLM</Badge>
<h1 class="hero-h1" id="hero-h">Graded trust<br>for <span class="oracle">code changes.</span></h1>
<p class="hero-sub">`augur` reads a diff and tells you how risky it is, and whether a human should look, as a deterministic, scriptable verdict: proceed, review, or block.</p>
<div class="verdict-row" aria-label="The three verdicts">
<Verdict kind="proceed" />
<Verdict kind="review" />
<Verdict kind="block" />
</div>
<div class="hero-actions">
<Button href={`${base}docs/quickstart`} variant="primary">Get started <span aria-hidden="true">→</span></Button>
<Button href={`${base}docs/signals`} variant="secondary">See the signals</Button>
</div>
<p class="hero-fineprint">Build it: <code>swift build -c release</code> · macOS &amp; Linux · Swift 6 · git</p>
<p class="hero-fineprint">Colored, TTY-aware output: <code>--color auto|always|never</code>, honors <code>NO_COLOR</code>; piped &amp; JSON stay plain.</p>
</div>
<div>
<img
class="hero-demo"
src={`${base}demo.gif`}
alt="Running augur check on a working-tree change: it returns a REVIEW verdict at risk 35 of 100 because the edited file matches the sensitive 'secrets' category."
width="1200"
height="600"
loading="eager"
decoding="async"
/>
</div>
</div>
</div>
</section>

<section class="stats" aria-label="Key numbers">
<div class="container">
<ul class="stats-grid">
<li class="stat"><div class="num">3</div><div class="lbl">verdicts</div><div class="sub">proceed · review · block</div></li>
<li class="stat"><div class="num">8</div><div class="lbl">signals</div><div class="sub">all from git + the filesystem</div></li>
<li class="stat"><div class="num">0</div><div class="lbl">API keys</div><div class="sub">no LLM in the core, ever</div></li>
<li class="stat"><div class="num">0</div><div class="lbl">third-party deps</div><div class="sub">AugurKit is Foundation-only</div></li>
</ul>
</div>
</section>

<section class="pillars" aria-labelledby="why-h">
<div class="container">
<header class="section-head">
<p class="section-eyebrow">Why it exists</p>
<h2 id="why-h">Agents made code cheap.<br>The scarce resource is now <em>trust.</em></h2>
<p>`augur` turns the senior-engineer instinct ("this part is fine, that part needs a careful look") into a deterministic artifact both humans and agents can act on.</p>
</header>

<Callout type="caveat">
<p><strong>The missing primitive.</strong> Humans can't hand-review the volume agents produce, and agents have no native sense of "I'm out of my depth here, escalate." `augur` is that primitive: language-agnostic, CI-agnostic, requiring no API key and no LLM.</p>
</Callout>

<ul class="why-grid">
<li class="why-card">
<div class="why-icon" aria-hidden="true">👤</div>
<h3>Humans triage</h3>
<p>Spend review attention on the risky 10% of a 40-file PR. `augur` sorts the files riskiest-first and tells you exactly which signal fired.</p>
</li>
<li class="why-card">
<div class="why-icon" aria-hidden="true">🤖</div>
<h3>Agents gate</h3>
<p><code>augur gate</code> exits non-zero so an agent escalates to a human instead of merging blind. Drop it in a CI step or an agent loop.</p>
</li>
<li class="why-card">
<div class="why-icon" aria-hidden="true">🔬</div>
<h3>Deterministic & grounded</h3>
<p>Every signal is derived from git history and the filesystem. No model, no network. A history calibration reports whether a score is guessing or grounded.</p>
</li>
</ul>
</div>
</section>

<section class="signals-strip" aria-labelledby="signals-h">
<div class="container">
<div class="strip-head">
<h2 id="signals-h">Eight signals, <em>one verdict.</em></h2>
<a href={`${base}docs/signals`} class="link">Read the signal reference <span aria-hidden="true">→</span></a>
</div>
<p class="strip-sub">Each signal is a pure function over the change surface and git history, contributing a documented weight to a transparent blend. No opaque numbers.</p>
<ul class="signal-grid">
{signals.map(s => (
<li class="signal-card">
<div class="signal-name">{s.name}</div>
<p>{s.catches}</p>
</li>
))}
</ul>
</div>
</section>

<section class="trust-strip" aria-labelledby="trust-h">
<div class="container">
<header class="section-head">
<p class="section-eyebrow">Trust pipeline</p>
<h2 id="trust-h">augur scores the risk.<br><em>attest</em> records the trust.</h2>
<p>A verdict from `augur` is ephemeral: it lives for one CI run and is gone. Its sibling <a href="https://github.com/CorvidLabs/attest">attest</a> makes it durable: a signed-or-unsigned provenance note, keyed to the commit SHA, of who or what reviewed a change and at what confidence. They compose over a pipe and never link to each other.</p>
</header>
<div class="trust-code">
<pre><code>augur check --json | attest sign --from-augur - <span class="cc">{'# record the trust'}</span>
attest verify --policy .attest.json <span class="cc">{'# gate on it'}</span></code></pre>
</div>
<div class="trust-actions">
<Button href={`${base}docs/ci-integration`} variant="secondary">CI integration &amp; SARIF</Button>
</div>
</div>
</section>

<section class="cta-banner" aria-labelledby="cta-h">
<div class="container">
<h2 id="cta-h">Stop merging on <em>vibes.</em><br>Get a verdict.</h2>
<p>Build augur and run your first risk assessment in under a minute.</p>
<div class="cta-install">
<span aria-hidden="true" style="color: var(--accent-bright);">$</span>
<code>augur check --range main..HEAD</code>
</div>
<div class="cta-actions">
<Button href={`${base}docs`} variant="primary">Read the docs</Button>
<Button href="https://github.com/CorvidLabs/augur" variant="secondary">View on GitHub</Button>
</div>
</div>
</section>

</main>
</BaseLayout>

<style>
main { background-image: radial-gradient(ellipse 1200px 600px at 50% -200px, rgba(139,92,246,0.14), transparent 70%); }
.hero { padding: 80px 0 60px; }
.hero-grid { display: grid; grid-template-columns: 1fr 1.15fr; gap: 56px; align-items: center; }
.hero-h1 { font-size: clamp(2.4rem, 5vw, 3.6rem); line-height: 1.05; letter-spacing: -0.025em; margin: 22px 0; }
.hero-h1 .oracle { background: linear-gradient(120deg, var(--accent-bright) 0%, var(--accent) 60%, var(--accent-deep) 100%);
-webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;
font-style: italic; font-family: var(--serif); font-weight: 500; }
.hero-sub { color: var(--text-muted); font-size: 1.125rem; max-width: 480px; margin-bottom: 22px; line-height: 1.6; }
.verdict-row { display: flex; gap: 10px; margin-bottom: 26px; flex-wrap: wrap; }
.hero-actions { display: flex; gap: 12px; margin-bottom: 24px; flex-wrap: wrap; }
.hero-fineprint { color: var(--text-muted); font-size: 0.9375rem; }
.hero-fineprint code { background: var(--bg-raised); padding: 4px 8px; border-radius: 4px;
border: 1px solid var(--border); color: var(--accent-bright);
font-family: var(--mono); font-size: 0.875rem; }
.hero-demo { width: 100%; height: auto; border-radius: 12px; border: 1px solid var(--border);
box-shadow: 0 24px 60px -20px rgba(0,0,0,0.55); display: block; }
.stats { padding: 60px 0; border-top: 1px solid var(--border); border-bottom: 1px solid var(--border);
margin-top: 40px; background: linear-gradient(180deg, transparent, rgba(139,92,246,0.03), transparent); }
.stats-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 32px; }
.stat .num { font-size: 2.5rem; font-weight: 700; letter-spacing: -0.02em;
color: var(--accent-bright); font-family: var(--serif); line-height: 1; }
.stat .lbl { color: var(--text); font-size: 1rem; margin-top: 8px; font-weight: 500; }
.stat .sub { color: var(--text-muted); font-size: 0.875rem; margin-top: 4px; }
.pillars { padding: 100px 0 60px; }
.section-head { margin-bottom: 32px; }
.section-eyebrow { color: var(--accent-bright); font-size: 0.875rem; font-weight: 600;
letter-spacing: 0.12em; text-transform: uppercase; margin-bottom: 14px; }
.section-head h2 { font-size: clamp(1.85rem, 3.5vw, 2.6rem); letter-spacing: -0.02em;
max-width: 620px; line-height: 1.15; margin-bottom: 14px; }
.section-head h2 em { font-style: italic; font-family: var(--serif);
color: var(--accent-bright); font-weight: 400; }
.section-head p { color: var(--text-muted); font-size: 1.0625rem; max-width: 620px; }
.section-head p a { color: var(--accent-bright); text-decoration: underline; text-underline-offset: 3px; }
.why-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; margin-top: 28px; }
.why-card { padding: 26px; background: var(--bg-raised); border: 1px solid var(--border);
border-radius: var(--radius); transition: border-color .15s; }
.why-card:hover { border-color: var(--accent); }
.why-icon { font-size: 1.75rem; margin-bottom: 14px; }
.why-card h3 { font-size: 1.125rem; margin-bottom: 8px; }
.why-card p { color: var(--text-muted); font-size: 0.9375rem; line-height: 1.6; }
.why-card code { font-family: var(--mono); font-size: 0.875em; color: var(--accent-bright); }
.signals-strip { padding: 80px 0; }
.strip-head { display: flex; justify-content: space-between; align-items: end;
margin-bottom: 8px; gap: 16px; flex-wrap: wrap; }
.strip-head h2 { font-size: clamp(1.5rem, 3vw, 2rem); letter-spacing: -0.015em; }
.strip-head h2 em { font-family: var(--serif); font-style: italic; color: var(--accent-bright); font-weight: 400; }
.strip-head .link { color: var(--accent-bright); font-size: 0.9375rem; padding: 8px 0; }
.strip-head .link:hover { text-decoration: underline; }
.strip-sub { color: var(--text-muted); font-size: 1.0625rem; max-width: 620px; margin-bottom: 28px; }
.signal-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; }
.signal-card { display: block; padding: 18px; background: var(--bg-raised);
border: 1px solid var(--border); border-radius: 8px; transition: border-color .15s; }
.signal-card:hover { border-color: var(--accent); }
.signal-name { font-family: var(--mono); font-size: 0.9375rem; color: var(--accent-bright); margin-bottom: 10px; }
.signal-card p { color: var(--text-muted); font-size: 0.875rem; line-height: 1.55; }
.trust-strip { padding: 80px 0; background: linear-gradient(180deg, transparent, rgba(139,92,246,0.04)); }
.trust-code { margin-top: 8px; }
.trust-code pre { background: var(--bg-raised); border: 1px solid var(--border-strong);
border-radius: var(--radius); padding: 18px 20px; overflow-x: auto;
font-family: var(--mono); font-size: 0.875rem; line-height: 1.9; }
.trust-code .cc { color: var(--text-dim); font-style: italic; }
.trust-actions { margin-top: 24px; }
.cta-banner { padding: 120px 0 100px; text-align: center; position: relative; overflow: hidden; }
.cta-banner::before { content: ''; position: absolute; inset: 0;
background: radial-gradient(ellipse 800px 400px at center, var(--accent-glow), transparent 70%);
pointer-events: none; }
.cta-banner > * { position: relative; }
.cta-banner h2 { font-size: clamp(2rem, 4vw, 2.8rem); max-width: 640px;
margin: 0 auto 16px; letter-spacing: -0.02em; line-height: 1.15; }
.cta-banner h2 em { font-family: var(--serif); font-style: italic;
color: var(--accent-bright); font-weight: 400; }
.cta-banner p { color: var(--text-muted); margin: 0 auto 28px; max-width: 460px; font-size: 1.0625rem; }
.cta-install { display: inline-flex; align-items: center; gap: 14px;
padding: 16px 22px; background: var(--bg-raised); border: 1px solid var(--border-strong);
border-radius: 10px; font-family: var(--mono); font-size: 1rem; }
.cta-actions { display: flex; gap: 12px; justify-content: center; margin-top: 24px; flex-wrap: wrap; }
@media (max-width: 900px) {
.hero-grid, .stats-grid, .signal-grid, .why-grid { grid-template-columns: 1fr; }
}
@media (max-width: 600px) { .signal-grid { grid-template-columns: 1fr; } }
</style>
<RedirectLayout title="augur has moved to CorvidLabs" destination={HUB_MARKETING} />
Loading