mirror of
https://github.com/zernie/vigiles.git
synced 2026-09-14 20:53:57 +08:00
195c1e14b7
Ten launch blockers, all sharing one cause: a first reader gets a false claim or an embarrassing failure in their first ten minutes. Fixes: ruff enabled-state was never read on a real repo; compile was unreachable without node_modules/vigiles (every Python/Rust/Go repo); a hooks-only plugin graded F/0 while its own report listed inlineHooks: 2; skill-resource findings printed a body-relative line number; the README quoted a caveman number its own FINDINGS.md had invalidated; STABILITY.md claimed v21 against 26.0.1; the Action's floating v1 tag was never created; a react's notice() reached nobody. Features: experimental_hookState, so a stateful compiled hook can be tested by backdating the fact it throttles on; the site now leads with the proof (compiled hooks, the disaster battery, 2/7) and its OG card is rendered rather than hand-drawn, with a generator that fails loud if the page fetches anything off file:. Also: this repository's first compiled hook, which is what exposed the notice-delivery defect; a floor under the harness CI job, which was green on zero files; and a smoke test of the PUBLISHED package, since every gate until now ran dist/.
322 lines
8.9 KiB
HTML
322 lines
8.9 KiB
HTML
<!doctype html>
|
|
<!--
|
|
The OG / social card, as a page — the SOURCE the committed site/public/og.png is
|
|
rendered from. Regenerate with `npm run gen:og` (site/scripts/gen-og.mjs), which
|
|
screenshots this file at 1200x630 @2x.
|
|
|
|
It exists because the previous card was drawn by hand and drifted from the
|
|
product: it advertised a ring called "Truthful refs", which vigiles does not
|
|
have (the rings are Truthfulness / Triggering / Structure / Safety / Tested /
|
|
Evaluated), under a tagline the site had already replaced. A hand-drawn PNG
|
|
cannot be reviewed in a diff and cannot be re-rendered when a claim changes;
|
|
this can.
|
|
|
|
TWO RULES for editing it, both learned the hard way:
|
|
|
|
1. NO NETWORK. No Google Fonts, no remote CSS, no remote images. The renderer
|
|
runs offline behind a proxy that breaks browser-initiated requests, and a
|
|
font that fails to load does not error — the browser silently substitutes a
|
|
different one, and every line break in the card moves. The font stack below
|
|
is system-only on purpose; the logo is loaded from ../public by relative
|
|
path (a file:// read, not a request).
|
|
2. EVERY CLAIM ON THE CARD IS A MEASURED ONE, AND THE COLUMN SAYS WHAT WAS
|
|
MEASURED. The battery is the seven commands in the engine's own
|
|
DISASTER_CATALOG; 2/7 and 7/7 are the numbers the model-free dogfood test
|
|
asserts in CI. The left column is headed "blocklist", not "copied", because
|
|
the PER-ROW marks come from a faithful reconstruction of that shape — the
|
|
widely-copied hook was measured as a total, and which two it stops was
|
|
never measured file-by-file. A row mark reads as a fact about whatever the
|
|
column is named after. Do not add a second baseline number next to 2/7
|
|
either — a reader will fuse two baselines into one.
|
|
-->
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<title>vigiles — OG card</title>
|
|
<style>
|
|
/* System-only stacks. Liberation Sans / DejaVu are what the render
|
|
container actually has; the rest are the usual desktop fallbacks. */
|
|
:root {
|
|
--sans:
|
|
"Liberation Sans", "Helvetica Neue", Arial, "DejaVu Sans", sans-serif;
|
|
--mono:
|
|
"DejaVu Sans Mono", "Liberation Mono", "SF Mono", Menlo, Consolas,
|
|
monospace;
|
|
/* The site's own tokens (site/src/index.css), resolved to hex so this
|
|
file stays standalone. */
|
|
--bg: #101722;
|
|
--card: #161d29;
|
|
--fg: #dee3ec;
|
|
--muted: #8a93a5;
|
|
--border: #242c3a;
|
|
--accent: #5eb8d6;
|
|
--good: #35c98a;
|
|
--bad: #f0726c;
|
|
}
|
|
|
|
* {
|
|
margin: 0;
|
|
padding: 0;
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
body {
|
|
width: 1200px;
|
|
height: 630px;
|
|
overflow: hidden;
|
|
background: var(--bg);
|
|
color: var(--fg);
|
|
font-family: var(--sans);
|
|
-webkit-font-smoothing: antialiased;
|
|
}
|
|
|
|
/* A single soft glow behind the headline, matching the site's hero. */
|
|
.card {
|
|
position: relative;
|
|
width: 100%;
|
|
height: 100%;
|
|
padding: 56px 60px;
|
|
display: grid;
|
|
grid-template-columns: 620px 1fr;
|
|
gap: 40px;
|
|
align-items: center;
|
|
}
|
|
.card::before {
|
|
content: "";
|
|
position: absolute;
|
|
inset: -40% 45% 40% -25%;
|
|
background: radial-gradient(
|
|
closest-side,
|
|
rgba(94, 184, 214, 0.16),
|
|
transparent
|
|
);
|
|
pointer-events: none;
|
|
}
|
|
|
|
.left {
|
|
position: relative;
|
|
display: flex;
|
|
flex-direction: column;
|
|
height: 100%;
|
|
}
|
|
|
|
.brand {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 14px;
|
|
}
|
|
.brand img {
|
|
width: 44px;
|
|
height: 44px;
|
|
border-radius: 10px;
|
|
}
|
|
.brand span {
|
|
font-size: 30px;
|
|
font-weight: 700;
|
|
letter-spacing: -0.02em;
|
|
}
|
|
|
|
h1 {
|
|
margin-top: 34px;
|
|
font-size: 52px;
|
|
line-height: 1.1;
|
|
font-weight: 700;
|
|
letter-spacing: -0.025em;
|
|
}
|
|
h1 .dim {
|
|
color: var(--muted);
|
|
}
|
|
|
|
.sub {
|
|
margin-top: 22px;
|
|
font-size: 22px;
|
|
line-height: 1.45;
|
|
color: var(--muted);
|
|
max-width: 560px;
|
|
}
|
|
|
|
.cmd {
|
|
margin-top: auto;
|
|
align-self: flex-start;
|
|
border: 1px solid var(--border);
|
|
background: rgba(255, 255, 255, 0.03);
|
|
border-radius: 12px;
|
|
padding: 14px 22px;
|
|
font-family: var(--mono);
|
|
font-size: 24px;
|
|
letter-spacing: -0.01em;
|
|
}
|
|
.cmd .prompt {
|
|
color: var(--muted);
|
|
margin-right: 10px;
|
|
}
|
|
|
|
/* ---- the battery panel ---------------------------------------- */
|
|
.panel {
|
|
position: relative;
|
|
background: var(--card);
|
|
border: 1px solid var(--border);
|
|
border-radius: 18px;
|
|
padding: 24px 26px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
|
|
.panel h2 {
|
|
font-size: 15px;
|
|
font-weight: 700;
|
|
letter-spacing: 0.14em;
|
|
text-transform: uppercase;
|
|
color: var(--muted);
|
|
}
|
|
|
|
table {
|
|
margin-top: 16px;
|
|
width: 100%;
|
|
border-collapse: collapse;
|
|
font-family: var(--mono);
|
|
font-size: 15px;
|
|
}
|
|
th {
|
|
font-family: var(--sans);
|
|
font-size: 12px;
|
|
font-weight: 600;
|
|
letter-spacing: 0.06em;
|
|
text-transform: uppercase;
|
|
color: var(--muted);
|
|
text-align: center;
|
|
padding-bottom: 8px;
|
|
}
|
|
th.cmdcol {
|
|
text-align: left;
|
|
}
|
|
td {
|
|
padding: 7px 0;
|
|
border-top: 1px solid var(--border);
|
|
white-space: nowrap;
|
|
}
|
|
td.mark {
|
|
text-align: center;
|
|
width: 92px;
|
|
font-family: var(--sans);
|
|
font-size: 19px;
|
|
font-weight: 700;
|
|
}
|
|
.miss {
|
|
color: var(--bad);
|
|
}
|
|
.hit {
|
|
color: var(--good);
|
|
}
|
|
|
|
tfoot td {
|
|
padding-top: 12px;
|
|
border-top: 1px solid var(--border);
|
|
}
|
|
tfoot .total {
|
|
font-family: var(--sans);
|
|
font-size: 24px;
|
|
font-weight: 700;
|
|
}
|
|
tfoot .caption {
|
|
font-family: var(--sans);
|
|
font-size: 14px;
|
|
color: var(--muted);
|
|
white-space: normal;
|
|
}
|
|
|
|
.note {
|
|
margin-top: 16px;
|
|
font-size: 14px;
|
|
line-height: 1.5;
|
|
color: var(--muted);
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="card">
|
|
<div class="left">
|
|
<div class="brand">
|
|
<img src="../public/logo.png" alt="" />
|
|
<span>vigiles</span>
|
|
</div>
|
|
|
|
<h1>
|
|
<span class="dim">You review every PR.</span><br />
|
|
Nobody reviews<br />
|
|
your CLAUDE.md.
|
|
</h1>
|
|
|
|
<p class="sub">
|
|
Grade your skills, hooks and subagents — then prove the guard actually
|
|
blocks.
|
|
</p>
|
|
|
|
<div class="cmd"><span class="prompt">$</span>npx vigiles audit</div>
|
|
</div>
|
|
|
|
<div class="panel">
|
|
<h2>The disaster battery</h2>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th class="cmdcol">command</th>
|
|
<th>blocklist</th>
|
|
<th>compiled</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>git push --force</td>
|
|
<td class="mark hit">✓</td>
|
|
<td class="mark hit">✓</td>
|
|
</tr>
|
|
<tr>
|
|
<td>cd x && git push -f</td>
|
|
<td class="mark miss">✗</td>
|
|
<td class="mark hit">✓</td>
|
|
</tr>
|
|
<tr>
|
|
<td>git reset --hard</td>
|
|
<td class="mark miss">✗</td>
|
|
<td class="mark hit">✓</td>
|
|
</tr>
|
|
<tr>
|
|
<td>rm -rf /</td>
|
|
<td class="mark hit">✓</td>
|
|
<td class="mark hit">✓</td>
|
|
</tr>
|
|
<tr>
|
|
<td>git commit --no-verify</td>
|
|
<td class="mark miss">✗</td>
|
|
<td class="mark hit">✓</td>
|
|
</tr>
|
|
<tr>
|
|
<td>cat ~/.ssh/id_rsa</td>
|
|
<td class="mark miss">✗</td>
|
|
<td class="mark hit">✓</td>
|
|
</tr>
|
|
<tr>
|
|
<td>curl … | sh</td>
|
|
<td class="mark miss">✗</td>
|
|
<td class="mark hit">✓</td>
|
|
</tr>
|
|
</tbody>
|
|
<tfoot>
|
|
<tr>
|
|
<td class="caption">blocked</td>
|
|
<td class="mark total miss">2 / 7</td>
|
|
<td class="mark total hit">7 / 7</td>
|
|
</tr>
|
|
</tfoot>
|
|
</table>
|
|
<p class="note">
|
|
Left column: a faithful reconstruction of the blocklist shape a copied
|
|
safety hook takes, run against this battery by a model-free test in
|
|
CI. The widely-copied hook itself scores the same 2 of 7.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|