@spec-engine/spec-engine 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +67 -0
- package/dist/cli.js +11 -0
- package/dist/docs/404.html +41 -0
- package/dist/docs/CNAME +1 -0
- package/dist/docs/_astro/Code.DfIJP77p.css +1 -0
- package/dist/docs/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.hwBsy0Mo.js +1 -0
- package/dist/docs/_astro/Search.astro_astro_type_script_index_0_lang.lq3t8uE2.js +1 -0
- package/dist/docs/_astro/TableOfContents.astro_astro_type_script_index_0_lang.FuRcXuRY.js +1 -0
- package/dist/docs/_astro/common.xlUlWolS.css +1 -0
- package/dist/docs/_astro/ec.0vx5m.js +3 -0
- package/dist/docs/_astro/ec.v4551.css +1 -0
- package/dist/docs/_astro/page.B_tncCx8.js +1 -0
- package/dist/docs/_astro/print.DNXP8c50.css +1 -0
- package/dist/docs/_astro/spec-mark-black.ZCN22lJi.svg +7 -0
- package/dist/docs/_astro/spec-mark-white.DJBFLLUP.svg +7 -0
- package/dist/docs/_astro/ui-core.C8327L_n.js +2 -0
- package/dist/docs/agent-reference/index.html +108 -0
- package/dist/docs/architecture/index.html +81 -0
- package/dist/docs/checks/index.html +267 -0
- package/dist/docs/commands/index.html +228 -0
- package/dist/docs/favicon-16.png +0 -0
- package/dist/docs/favicon-180.png +0 -0
- package/dist/docs/favicon-192.png +0 -0
- package/dist/docs/favicon-32.png +0 -0
- package/dist/docs/favicon-512.png +0 -0
- package/dist/docs/favicon.ico +0 -0
- package/dist/docs/favicon.svg +8 -0
- package/dist/docs/format/index.html +172 -0
- package/dist/docs/getting-started/index.html +92 -0
- package/dist/docs/guides/adoption/index.html +84 -0
- package/dist/docs/guides/platform-setup/index.html +95 -0
- package/dist/docs/guides/single-repo/index.html +82 -0
- package/dist/docs/index.html +152 -0
- package/dist/docs/maskable-512.png +0 -0
- package/dist/docs/og-spec-engine-docs.png +0 -0
- package/dist/docs/og-spec-engine.png +0 -0
- package/dist/docs/overview/index.html +124 -0
- package/dist/docs/pagefind/fragment/en_3f97d08.pf_fragment +0 -0
- package/dist/docs/pagefind/fragment/en_51433aa.pf_fragment +0 -0
- package/dist/docs/pagefind/fragment/en_629887a.pf_fragment +0 -0
- package/dist/docs/pagefind/fragment/en_6339f38.pf_fragment +0 -0
- package/dist/docs/pagefind/fragment/en_74b2c3a.pf_fragment +0 -0
- package/dist/docs/pagefind/fragment/en_79e59c8.pf_fragment +0 -0
- package/dist/docs/pagefind/fragment/en_a4de4f3.pf_fragment +0 -0
- package/dist/docs/pagefind/fragment/en_ae342c4.pf_fragment +0 -0
- package/dist/docs/pagefind/fragment/en_b571467.pf_fragment +0 -0
- package/dist/docs/pagefind/fragment/en_cc9f632.pf_fragment +0 -0
- package/dist/docs/pagefind/fragment/en_dc8d1bd.pf_fragment +0 -0
- package/dist/docs/pagefind/index/en_4f59892.pf_index +0 -0
- package/dist/docs/pagefind/pagefind-component-ui.css +1509 -0
- package/dist/docs/pagefind/pagefind-component-ui.js +56 -0
- package/dist/docs/pagefind/pagefind-entry.json +1 -0
- package/dist/docs/pagefind/pagefind-highlight.js +1070 -0
- package/dist/docs/pagefind/pagefind-modular-ui.css +214 -0
- package/dist/docs/pagefind/pagefind-modular-ui.js +8 -0
- package/dist/docs/pagefind/pagefind-ui.css +1 -0
- package/dist/docs/pagefind/pagefind-ui.js +2 -0
- package/dist/docs/pagefind/pagefind-worker.js +6 -0
- package/dist/docs/pagefind/pagefind.en_c8da4a195d.pf_meta +0 -0
- package/dist/docs/pagefind/pagefind.js +6 -0
- package/dist/docs/pagefind/wasm.en.pagefind +0 -0
- package/dist/docs/pagefind/wasm.unknown.pagefind +0 -0
- package/dist/docs/site.webmanifest +25 -0
- package/dist/docs/sitemap-0.xml +1 -0
- package/dist/docs/sitemap-index.xml +1 -0
- package/dist/docs/tags/index.html +112 -0
- package/dist/impl.js +11050 -0
- package/package.json +48 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
<!DOCTYPE html><html lang="en" class="astro-j7pv25f6"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Spec Engine — Keep your coding agents honest.</title><meta name="description" content="Durable specs. Permanent IDs. Drift caught in CI before it ships."><link rel="icon" href="/favicon.ico" sizes="any"><link rel="icon" href="/favicon.svg" type="image/svg+xml"><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png"><link rel="icon" type="image/png" sizes="16x16" href="/favicon-16.png"><link rel="apple-touch-icon" sizes="180x180" href="/favicon-180.png"><link rel="manifest" href="/site.webmanifest"><meta name="theme-color" content="#0F1214"><meta property="og:type" content="website"><meta property="og:site_name" content="Spec Engine"><meta property="og:title" content="Keep your coding agents honest."><meta property="og:description" content="Durable specs. Permanent IDs. Drift caught in CI before it ships."><meta property="og:url" content="https://docs.spec-engine.dev/"><meta property="og:image" content="https://docs.spec-engine.dev/og-spec-engine.png"><meta property="og:image:width" content="1200"><meta property="og:image:height" content="630"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="Keep your coding agents honest."><meta name="twitter:description" content="Durable specs. Permanent IDs. Drift caught in CI before it ships."><meta name="twitter:image" content="https://docs.spec-engine.dev/og-spec-engine.png"><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Archivo:wght@500;600;700;800;900&family=IBM+Plex+Mono:wght@400;500;600;700&family=IBM+Plex+Sans:wght@400;500;600&display=swap" rel="stylesheet"><style>:root{--ink: #0f1214;--charcoal: #151a1e;--panel: #14181b;--elev: #1e262b;--bone: #f1eee6;--paper: #fbfaf5;--line-d: rgba(255, 255, 255, .09);--line-d2: rgba(255, 255, 255, .16);--line-l: #e3e0d6;--fg-d: #e7e4db;--dim-d: #a7acb0;--mute-d: #868d94;--fg-l: #1b2024;--dim-l: #4a5157;--mute-l: #868d94;--acc: #c4f135;--acc-ink: #0f1214;--acc-soft: color-mix(in srgb, var(--acc) 15%, transparent);--acc-line: color-mix(in srgb, var(--acc) 42%, transparent);--verified: #c4f135;--verified-soft: color-mix(in srgb, #c4f135 15%, transparent);--verified-line: color-mix(in srgb, #c4f135 45%, transparent);--drift: #e8a317;--broken: #f0472e;--unbound: #868d94;--grid-op: 1;--f-disp: "Archivo";--f-sans: "IBM Plex Sans";--f-mono: "IBM Plex Mono"}:where(.astro-j7pv25f6){box-sizing:border-box}html{-webkit-font-smoothing:antialiased;scroll-behavior:smooth}body{margin:0;font-family:var(--f-sans),system-ui,sans-serif;color:var(--fg-d);background:var(--ink)}:where(.astro-j7pv25f6)::selection{background:var(--acc);color:var(--acc-ink)}a:where(.astro-j7pv25f6){text-decoration:none;color:inherit}.hov-fg:where(.astro-j7pv25f6):hover{color:var(--fg-d)!important}.btn-acc:where(.astro-j7pv25f6):hover{filter:brightness(.94)}.btn-ghost:where(.astro-j7pv25f6):hover{border-color:var(--fg-d)!important}@media(max-width:820px){:where(.astro-j7pv25f6)[data-stack]{grid-template-columns:1fr!important;gap:28px!important}header:where(.astro-j7pv25f6) nav:where(.astro-j7pv25f6){display:none!important}:where(.astro-j7pv25f6)[data-mobile-hide]{display:none!important}:where(.astro-j7pv25f6)[data-mobile-bar]{display:flex!important}:where(.astro-j7pv25f6)[data-matrix]{overflow-x:auto!important}:where(.astro-j7pv25f6)[data-matrix]>div:where(.astro-j7pv25f6){min-width:560px}}
|
|
2
|
+
</style><script type="module" src="/_astro/page.B_tncCx8.js"></script></head> <body class="astro-j7pv25f6"> <div style="background:var(--ink);overflow-x:hidden" class="astro-j7pv25f6"> <!-- ============ NAV ============ --> <header style="position:sticky;top:0;z-index:50;background:color-mix(in srgb,var(--ink) 90%,transparent);backdrop-filter:blur(10px);border-bottom:1px solid var(--line-d)" class="astro-j7pv25f6"> <div style="max-width:1200px;margin:0 auto;display:flex;align-items:center;gap:28px;padding:15px 28px" class="astro-j7pv25f6"> <a href="#top" style="display:flex;align-items:center;gap:10px" class="astro-j7pv25f6"> <svg width="24" height="24" viewBox="0 0 64 64" fill="none" class="astro-j7pv25f6"><path d="M25 13 H13 V51 H25" stroke="var(--fg-d)" stroke-width="6" class="astro-j7pv25f6"></path><path d="M39 13 H51 V51 H39" stroke="var(--fg-d)" stroke-width="6" class="astro-j7pv25f6"></path><rect x="26" y="26" width="12" height="12" fill="var(--acc)" class="astro-j7pv25f6"></rect><line x1="32" y1="13" x2="32" y2="24" stroke="var(--fg-d)" stroke-width="4" class="astro-j7pv25f6"></line><line x1="32" y1="40" x2="32" y2="51" stroke="var(--fg-d)" stroke-width="4" class="astro-j7pv25f6"></line></svg> <span style="font-family:var(--f-disp);font-weight:800;font-size:16px;letter-spacing:-0.01em" class="astro-j7pv25f6">Spec Engine</span> </a> <nav style="display:flex;gap:26px;font-size:14px;color:var(--dim-d)" class="astro-j7pv25f6"> <a href="#how" class="hov-fg astro-j7pv25f6" style="color:var(--dim-d)">How it works</a> <a href="#product" class="hov-fg astro-j7pv25f6" style="color:var(--dim-d)">Product</a> <a href="#drift" class="hov-fg astro-j7pv25f6" style="color:var(--dim-d)">Drift gate</a> <a href="#features" class="hov-fg astro-j7pv25f6" style="color:var(--dim-d)">Features</a> </nav> <span style="flex:1" class="astro-j7pv25f6"></span> <a href="/overview/" data-mobile-hide class="hov-fg astro-j7pv25f6" style="font-size:14px;color:var(--dim-d)">Docs</a> <a href="https://github.com/spec-engine/spec-engine" data-mobile-hide class="btn-acc astro-j7pv25f6" style="display:inline-flex;align-items:center;gap:7px;font-family:var(--f-disp);font-weight:700;font-size:14px;background:var(--acc);color:var(--acc-ink);border-radius:6px;padding:9px 16px"><svg width="15" height="15" viewBox="0 0 16 16" fill="currentColor" style="flex:none" class="astro-j7pv25f6"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.65-.89-3.65-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.13 0 0 .67-.21 2.2.82a7.6 7.6 0 012-.27c.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.11.16 1.93.08 2.13.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8 8 0 008 0z" class="astro-j7pv25f6"></path></svg>Start free</a> </div> </header> <!-- ============ HERO ============ --> <section id="top" style="position:relative;overflow:hidden;border-bottom:1px solid var(--line-d)" class="astro-j7pv25f6"> <div style="position:absolute;inset:0;pointer-events:none;opacity:var(--grid-op);background-image:linear-gradient(rgba(255,255,255,0.045) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,0.045) 1px,transparent 1px);background-size:40px 40px" class="astro-j7pv25f6"></div> <div data-stack style="position:relative;max-width:1200px;margin:0 auto;display:grid;grid-template-columns:1.05fr 0.95fr;gap:54px;align-items:center;padding:92px 28px 96px" class="astro-j7pv25f6"> <div class="astro-j7pv25f6"> <div style="display:inline-flex;align-items:center;gap:9px;font-family:var(--f-mono);font-size:12px;letter-spacing:0.16em;color:var(--acc);margin-bottom:26px" class="astro-j7pv25f6"> <span style="width:7px;height:7px;background:var(--acc);display:inline-block" class="astro-j7pv25f6"></span>DETERMINISTIC BY
|
|
3
|
+
DESIGN
|
|
4
|
+
</div> <h1 style="font-family:var(--f-disp);font-weight:900;font-size:clamp(31px,4.7vw,52px);line-height:1.2;letter-spacing:-0.035em;margin:0" class="astro-j7pv25f6">
|
|
5
|
+
Keep your<br class="astro-j7pv25f6"><span style="white-space:nowrap" class="astro-j7pv25f6">coding agents <span style="background:var(--acc);color:var(--acc-ink);padding:0 8px" class="astro-j7pv25f6">honest.</span></span> </h1> <p style="font-size:18px;line-height:1.6;color:var(--dim-d);max-width:520px;margin:26px 0 0" class="astro-j7pv25f6">
|
|
6
|
+
Write your requirements as durable specs with permanent IDs. Spec Engine binds them to the real code
|
|
7
|
+
across every repo and catches drift in CI, before it ships.
|
|
8
|
+
</p> <div style="display:flex;gap:13px;margin-top:34px;flex-wrap:wrap" class="astro-j7pv25f6"> <a href="https://github.com/spec-engine/spec-engine" class="btn-acc astro-j7pv25f6" style="display:inline-flex;align-items:center;gap:10px;font-family:var(--f-disp);font-weight:700;font-size:15px;background:var(--acc);color:var(--acc-ink);border-radius:7px;padding:14px 24px"><svg width="17" height="17" viewBox="0 0 16 16" fill="currentColor" style="flex:none" class="astro-j7pv25f6"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.65-.89-3.65-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.13 0 0 .67-.21 2.2.82a7.6 7.6 0 012-.27c.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.11.16 1.93.08 2.13.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8 8 0 008 0z" class="astro-j7pv25f6"></path></svg>Start free</a> <a href="/overview/" class="btn-ghost astro-j7pv25f6" style="font-family:var(--f-disp);font-weight:700;font-size:15px;color:var(--fg-d);border:1.5px solid var(--line-d2);border-radius:7px;padding:13px 24px">Read the docs</a> </div> <div style="display:flex;align-items:center;gap:18px;margin-top:30px;font-family:var(--f-mono);font-size:12px;color:var(--mute-d);flex-wrap:wrap" class="astro-j7pv25f6"> <span style="display:flex;align-items:center;gap:7px" class="astro-j7pv25f6"><span style="width:8px;height:8px;border-radius:2px;background:var(--verified)" class="astro-j7pv25f6"></span>verified</span> <span style="display:flex;align-items:center;gap:7px" class="astro-j7pv25f6"><span style="width:8px;height:8px;border-radius:2px;background:var(--drift)" class="astro-j7pv25f6"></span>drift</span> <span style="display:flex;align-items:center;gap:7px" class="astro-j7pv25f6"><span style="width:8px;height:8px;border-radius:2px;background:var(--broken)" class="astro-j7pv25f6"></span>broken</span> <span class="astro-j7pv25f6">caught in CI, per requirement</span> </div> </div> <!-- hero product panel --> <div style="background:var(--panel);border:1px solid var(--line-d);border-radius:11px;overflow:hidden;box-shadow:0 30px 70px rgba(0,0,0,0.5)" class="astro-j7pv25f6"> <div style="display:flex;align-items:center;gap:8px;padding:12px 16px;border-bottom:1px solid var(--line-d);background:var(--charcoal)" class="astro-j7pv25f6"> <span style="width:9px;height:9px;border-radius:50%;background:#3A424A" class="astro-j7pv25f6"></span><span style="width:9px;height:9px;border-radius:50%;background:#3A424A" class="astro-j7pv25f6"></span><span style="width:9px;height:9px;border-radius:50%;background:#3A424A" class="astro-j7pv25f6"></span> <span style="font-family:var(--f-mono);font-size:11px;color:var(--mute-d);margin-left:8px" class="astro-j7pv25f6">specs/billing.spec.md</span> </div> <div style="padding:20px;font-family:var(--f-mono);font-size:13px;line-height:1.9" class="astro-j7pv25f6"> <div class="astro-j7pv25f6"> <span style="color:var(--mute-d)" class="astro-j7pv25f6">## </span><span style="color:var(--acc)" class="astro-j7pv25f6">[SPEC-0042]</span> <span style="color:var(--fg-d)" class="astro-j7pv25f6">Refunds are idempotent</span> </div> <div style="color:var(--dim-d);padding-left:20px" class="astro-j7pv25f6">Replaying a refund with the same key</div> <div style="color:var(--dim-d);padding-left:20px" class="astro-j7pv25f6">must never issue a second refund.</div> </div> <div style="border-top:1px solid var(--line-d);padding:16px 20px;display:flex;flex-direction:column;gap:11px" class="astro-j7pv25f6"> <div style="display:flex;align-items:center;gap:10px;font-family:var(--f-mono);font-size:12px" class="astro-j7pv25f6"> <span style="color:var(--mute-d);width:52px" class="astro-j7pv25f6">impl</span><span style="color:var(--dim-d);flex:1" class="astro-j7pv25f6">worker/refunds/handler.ts:44</span><span style="color:var(--dim-d)" class="astro-j7pv25f6">agent·Claude</span> </div> <div style="display:flex;align-items:center;gap:10px;font-family:var(--f-mono);font-size:12px" class="astro-j7pv25f6"> <span style="color:var(--mute-d);width:52px" class="astro-j7pv25f6">test</span><span style="color:var(--dim-d);flex:1" class="astro-j7pv25f6">worker/refunds/handler.test.ts</span><span style="color:var(--dim-d)" class="astro-j7pv25f6">ci·unit</span> </div> <div style="display:flex;align-items:center;justify-content:space-between;margin-top:5px" class="astro-j7pv25f6"> <span style="font-family:var(--f-mono);font-size:11px;color:var(--mute-d)" class="astro-j7pv25f6">bound across 3 repos</span> <span style="display:inline-flex;align-items:center;gap:7px;font-family:var(--f-mono);font-size:11px;font-weight:600;color:var(--acc-ink);background:var(--acc);border-radius:5px;padding:5px 10px" class="astro-j7pv25f6"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" class="astro-j7pv25f6"><path d="M5 12 L10 17 L19 6" stroke="var(--acc-ink)" stroke-width="2.4" class="astro-j7pv25f6"></path></svg>VERIFIED</span> </div> </div> </div> </div> </section> <!-- ============ QUICK START BAR ============ --> <div style="background:var(--charcoal);border-bottom:1px solid var(--line-d)" class="astro-j7pv25f6"> <div style="max-width:1200px;margin:0 auto;display:flex;align-items:center;gap:24px;flex-wrap:wrap;padding:16px 28px" class="astro-j7pv25f6"> <span style="font-family:var(--f-mono);font-size:11px;letter-spacing:0.12em;color:var(--mute-d)" class="astro-j7pv25f6">QUICK START</span> <div style="display:flex;align-items:center;gap:13px;background:var(--ink);border:1px solid var(--line-d2);border-radius:8px;padding:11px 16px;font-family:var(--f-mono);font-size:14px" class="astro-j7pv25f6"> <span style="color:var(--acc)" class="astro-j7pv25f6">$</span> <span id="quickstart-cmd" style="color:var(--fg-d)" class="astro-j7pv25f6">npm i -g spec-engine</span> <span style="width:1px;height:16px;background:var(--line-d2)" class="astro-j7pv25f6"></span> <button id="quickstart-copy" aria-label="Copy install command" style="all:unset;display:flex;cursor:pointer" class="astro-j7pv25f6"><svg width="15" height="15" viewBox="0 0 24 24" fill="none" class="astro-j7pv25f6"><rect x="8" y="8" width="12" height="12" rx="2" stroke="var(--mute-d)" stroke-width="1.75" class="astro-j7pv25f6"></rect><path d="M5 16 V6 A2 2 0 017 4 H15" stroke="var(--mute-d)" stroke-width="1.75" class="astro-j7pv25f6"></path></svg></button> </div> </div> </div> <!-- ============ IDEA / PILLARS ============ --> <section style="background:var(--bone);color:var(--fg-l);border-bottom:1px solid var(--line-l)" class="astro-j7pv25f6"> <div style="max-width:1200px;margin:0 auto;padding:92px 28px" class="astro-j7pv25f6"> <div style="font-family:var(--f-mono);font-size:12px;letter-spacing:0.16em;color:var(--mute-l);margin-bottom:26px" class="astro-j7pv25f6">
|
|
9
|
+
WHY IT HOLDS
|
|
10
|
+
</div> <p style="font-family:var(--f-disp);font-weight:700;font-size:clamp(26px,3.4vw,40px);line-height:1.2;letter-spacing:-0.025em;max-width:940px;margin:0" class="astro-j7pv25f6">
|
|
11
|
+
Spec Engine treats a requirement like a <span style="background:var(--acc);color:var(--acc-ink);padding:0 8px" class="astro-j7pv25f6">machined part</span>: stamped with a permanent ID, bound to the code that implements it, and measured continuously for drift.
|
|
12
|
+
</p> <div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:1px;background:var(--line-l);border:1px solid var(--line-l);margin-top:56px" class="astro-j7pv25f6"> <div style="background:var(--paper);padding:30px 26px" class="astro-j7pv25f6"> <div style="font-family:var(--f-mono);font-size:12px;color:#8A7400;letter-spacing:0.06em" class="astro-j7pv25f6">
|
|
13
|
+
DETERMINISTIC
|
|
14
|
+
</div> <p style="font-size:15px;line-height:1.6;color:var(--dim-l);margin:13px 0 0" class="astro-j7pv25f6">
|
|
15
|
+
A spec resolves to one answer: implemented, verified, drifted, or broken. No ambiguity, no vibes.
|
|
16
|
+
</p> </div> <div style="background:var(--paper);padding:30px 26px" class="astro-j7pv25f6"> <div style="font-family:var(--f-mono);font-size:12px;color:#8A7400;letter-spacing:0.06em" class="astro-j7pv25f6">MECHANICAL</div> <p style="font-size:15px;line-height:1.6;color:var(--dim-l);margin:13px 0 0" class="astro-j7pv25f6">
|
|
17
|
+
Specs clamp to code like tooling to a workpiece. Move the code, the binding follows or flags.
|
|
18
|
+
</p> </div> <div style="background:var(--paper);padding:30px 26px" class="astro-j7pv25f6"> <div style="font-family:var(--f-mono);font-size:12px;color:#8A7400;letter-spacing:0.06em" class="astro-j7pv25f6">TRUSTWORTHY</div> <p style="font-size:15px;line-height:1.6;color:var(--dim-l);margin:13px 0 0" class="astro-j7pv25f6">
|
|
19
|
+
CI is the referee. Drift is caught before it ships, not discovered in production a quarter later.
|
|
20
|
+
</p> </div> </div> </div> </section> <!-- ============ PRDs ============ --> <section style="position:relative;overflow:hidden;border-bottom:1px solid var(--line-d)" class="astro-j7pv25f6"> <div style="position:absolute;inset:0;pointer-events:none;opacity:var(--grid-op);background-image:linear-gradient(rgba(255,255,255,0.045) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,0.045) 1px,transparent 1px);background-size:40px 40px" class="astro-j7pv25f6"></div> <div style="position:relative;max-width:1200px;margin:0 auto;padding:90px 28px" class="astro-j7pv25f6"> <div style="font-family:var(--f-mono);font-size:12px;letter-spacing:0.16em;color:var(--acc);margin-bottom:12px" class="astro-j7pv25f6">
|
|
21
|
+
WORKS WITH YOUR PRDs
|
|
22
|
+
</div> <h2 style="font-family:var(--f-disp);font-weight:800;font-size:clamp(28px,3.6vw,42px);letter-spacing:-0.025em;line-height:1.08;margin:0 0 22px;max-width:920px" class="astro-j7pv25f6">
|
|
23
|
+
PRDs are great. They just don't live past production.
|
|
24
|
+
</h2> <div data-stack style="display:grid;grid-template-columns:1fr 1fr;gap:44px;align-items:start;margin-bottom:46px" class="astro-j7pv25f6"> <p style="font-size:16px;line-height:1.65;color:var(--dim-d);margin:0" class="astro-j7pv25f6">
|
|
25
|
+
We're not replacing your PRD. But the day you ship, it stops keeping up. The fix QA found never made it
|
|
26
|
+
back in. The quick customer request got deployed to the web app and forgotten on mobile. Six months on,
|
|
27
|
+
the doc describes a product you no longer have.
|
|
28
|
+
</p> <p style="font-size:16px;line-height:1.65;color:var(--fg-d);margin:0" class="astro-j7pv25f6">
|
|
29
|
+
Specs in Spec Engine <span style="color:var(--acc);font-weight:600" class="astro-j7pv25f6">live past production</span>. Every
|
|
30
|
+
one is versioned, and it only changes by being <span style="font-weight:600" class="astro-j7pv25f6">superseded</span> or <span style="font-weight:600" class="astro-j7pv25f6">removed on purpose</span>, never by quietly falling out of sync.
|
|
31
|
+
</p> </div> <!-- lifespan diagram --> <div style="border:1px solid var(--line-d);border-radius:11px;background:var(--panel);padding:26px 26px 22px;overflow-x:auto" class="astro-j7pv25f6"> <div style="min-width:640px" class="astro-j7pv25f6"> <div style="display:grid;grid-template-columns:64px repeat(5,1fr);gap:7px;margin-bottom:10px" class="astro-j7pv25f6"> <span class="astro-j7pv25f6"></span> <span style="text-align:center;font-family:var(--f-mono);font-size:10px;letter-spacing:0.06em;color:var(--mute-d)" class="astro-j7pv25f6">KICKOFF</span> <span style="text-align:center;font-family:var(--f-mono);font-size:10px;letter-spacing:0.06em;color:var(--mute-d)" class="astro-j7pv25f6">BUILD</span> <span style="text-align:center;font-family:var(--f-mono);font-size:10px;letter-spacing:0.06em;color:var(--mute-d)" class="astro-j7pv25f6">QA</span> <span style="text-align:center;font-family:var(--f-mono);font-size:10px;letter-spacing:0.06em;color:var(--mute-d)" class="astro-j7pv25f6">SHIP</span> <span style="text-align:center;font-family:var(--f-mono);font-size:10px;letter-spacing:0.06em;color:var(--mute-d)" class="astro-j7pv25f6">+6 MONTHS</span> </div> <div style="display:grid;grid-template-columns:64px repeat(5,1fr);gap:7px;align-items:center;margin-bottom:9px" class="astro-j7pv25f6"> <span style="font-family:var(--f-mono);font-size:12px;color:var(--dim-d)" class="astro-j7pv25f6">PRD</span> <div style="height:36px;border-radius:5px;background:var(--elev);border:1px solid var(--line-d2)" class="astro-j7pv25f6"></div> <div style="height:36px;border-radius:5px;background:var(--elev);border:1px solid var(--line-d2)" class="astro-j7pv25f6"></div> <div style="height:36px;border-radius:5px;background:var(--elev);border:1px solid var(--line-d2);display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:10px;color:var(--mute-d);text-align:center;padding:0 4px" class="astro-j7pv25f6">
|
|
32
|
+
QA fix not added
|
|
33
|
+
</div> <div style="height:36px;border-radius:5px;background:var(--elev);border:1px solid var(--line-d2)" class="astro-j7pv25f6"></div> <div style="height:36px;border-radius:5px;border:1px dashed color-mix(in srgb,var(--broken) 50%,transparent);display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:10px;font-weight:600;color:var(--broken)" class="astro-j7pv25f6">
|
|
34
|
+
OUT OF DATE
|
|
35
|
+
</div> </div> <div style="display:grid;grid-template-columns:64px repeat(5,1fr);gap:7px;align-items:center" class="astro-j7pv25f6"> <span style="font-family:var(--f-mono);font-size:12px;color:var(--acc)" class="astro-j7pv25f6">Spec</span> <div style="height:36px;border-radius:5px;background:var(--acc-soft);border:1px solid var(--acc-line);display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:11px;font-weight:600;color:var(--acc)" class="astro-j7pv25f6">
|
|
36
|
+
v1
|
|
37
|
+
</div> <div style="height:36px;border-radius:5px;background:var(--acc-soft);border:1px solid var(--acc-line)" class="astro-j7pv25f6"></div> <div style="height:36px;border-radius:5px;background:var(--acc-soft);border:1px solid var(--acc-line);display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:11px;font-weight:600;color:var(--acc)" class="astro-j7pv25f6">
|
|
38
|
+
v2
|
|
39
|
+
</div> <div style="height:36px;border-radius:5px;background:var(--acc-soft);border:1px solid var(--acc-line)" class="astro-j7pv25f6"></div> <div style="height:36px;border-radius:5px;background:var(--verified-soft);border:1px solid var(--verified-line);display:flex;align-items:center;justify-content:center;gap:6px;font-family:var(--f-mono);font-size:11px;font-weight:600;color:var(--verified)" class="astro-j7pv25f6">
|
|
40
|
+
v3 <svg width="11" height="11" viewBox="0 0 24 24" fill="none" class="astro-j7pv25f6"><path d="M5 12 L10 17 L19 6" stroke="var(--verified)" stroke-width="2.6" class="astro-j7pv25f6"></path></svg> </div> </div> </div> <div style="margin-top:16px;padding-top:14px;border-top:1px solid var(--line-d);font-family:var(--f-mono);font-size:11px;color:var(--mute-d)" class="astro-j7pv25f6">
|
|
41
|
+
the PRD captures intent at kickoff · the spec keeps it true, versioned, long after ship
|
|
42
|
+
</div> </div> </div> </section> <!-- ============ HOW IT WORKS ============ --> <section id="how" style="background:var(--bone);color:var(--fg-l);border-bottom:1px solid var(--line-l)" class="astro-j7pv25f6"> <div style="max-width:1200px;margin:0 auto;padding:88px 28px" class="astro-j7pv25f6"> <div style="font-family:var(--f-mono);font-size:12px;letter-spacing:0.16em;color:var(--mute-l);margin-bottom:12px" class="astro-j7pv25f6">
|
|
43
|
+
HOW IT WORKS
|
|
44
|
+
</div> <h2 style="font-family:var(--f-disp);font-weight:800;font-size:34px;letter-spacing:-0.025em;margin:0 0 44px" class="astro-j7pv25f6">
|
|
45
|
+
Four moving parts, one source of truth
|
|
46
|
+
</h2> <div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:1px;background:var(--line-l);border:1px solid var(--line-l)" class="astro-j7pv25f6"> <div style="background:var(--paper);padding:28px 24px" class="astro-j7pv25f6"> <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:18px" class="astro-j7pv25f6"> <span style="width:40px;height:40px;border:1.75px solid var(--fg-l);border-radius:8px;display:flex;align-items:center;justify-content:center" class="astro-j7pv25f6"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" class="astro-j7pv25f6"><rect x="4" y="4" width="16" height="16" rx="1" stroke="var(--fg-l)" stroke-width="1.75" class="astro-j7pv25f6"></rect><path d="M8 10 H16 M8 14 H13" stroke="var(--fg-l)" stroke-width="1.75" class="astro-j7pv25f6"></path></svg></span><span style="font-family:var(--f-mono);font-size:12px;color:var(--mute-l)" class="astro-j7pv25f6">01</span> </div> <div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:8px" class="astro-j7pv25f6">Write the spec</div> <p style="font-size:14px;line-height:1.6;color:var(--dim-l);margin:0" class="astro-j7pv25f6">
|
|
47
|
+
Capture each requirement as a durable spec. Spec Engine stamps it with a permanent ID that never gets
|
|
48
|
+
reused.
|
|
49
|
+
</p> </div> <div style="background:var(--paper);padding:28px 24px" class="astro-j7pv25f6"> <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:18px" class="astro-j7pv25f6"> <span style="width:40px;height:40px;border:1.75px solid var(--fg-l);border-radius:8px;display:flex;align-items:center;justify-content:center" class="astro-j7pv25f6"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" class="astro-j7pv25f6"><circle cx="7" cy="12" r="2.5" stroke="var(--fg-l)" stroke-width="1.75" class="astro-j7pv25f6"></circle><circle cx="17" cy="7" r="2.5" stroke="var(--fg-l)" stroke-width="1.75" class="astro-j7pv25f6"></circle><circle cx="17" cy="17" r="2.5" stroke="var(--fg-l)" stroke-width="1.75" class="astro-j7pv25f6"></circle><path d="M9.2 11 L14.8 8 M9.2 13 L14.8 16" stroke="var(--fg-l)" stroke-width="1.75" class="astro-j7pv25f6"></path></svg></span><span style="font-family:var(--f-mono);font-size:12px;color:var(--mute-l)" class="astro-j7pv25f6">02</span> </div> <div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:8px" class="astro-j7pv25f6">Bind it to code</div> <p style="font-size:14px;line-height:1.6;color:var(--dim-l);margin:0" class="astro-j7pv25f6">
|
|
50
|
+
Tag the code and tests that satisfy it with <span style="font-family:var(--f-mono);color:#8A7400" class="astro-j7pv25f6">@spec(ID)</span>. The binding follows refactors across repos.
|
|
51
|
+
</p> </div> <div style="background:var(--paper);padding:28px 24px" class="astro-j7pv25f6"> <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:18px" class="astro-j7pv25f6"> <span style="width:40px;height:40px;border:1.75px solid var(--fg-l);border-radius:8px;display:flex;align-items:center;justify-content:center" class="astro-j7pv25f6"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" class="astro-j7pv25f6"><path d="M12 3 L20 6 V12 C20 17 16 20 12 21 C8 20 4 17 4 12 V6 Z" stroke="var(--fg-l)" stroke-width="1.75" class="astro-j7pv25f6"></path><path d="M8.5 12 L11 14.5 L15.5 9.5" stroke="var(--fg-l)" stroke-width="1.75" class="astro-j7pv25f6"></path></svg></span><span style="font-family:var(--f-mono);font-size:12px;color:var(--mute-l)" class="astro-j7pv25f6">03</span> </div> <div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:8px" class="astro-j7pv25f6">Verify in CI</div> <p style="font-size:14px;line-height:1.6;color:var(--dim-l);margin:0" class="astro-j7pv25f6">
|
|
52
|
+
Every run records who implemented each requirement and who verified it with tests, per repo.
|
|
53
|
+
</p> </div> <div style="background:var(--paper);padding:28px 24px" class="astro-j7pv25f6"> <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:18px" class="astro-j7pv25f6"> <span style="width:40px;height:40px;border:1.75px solid var(--broken);border-radius:8px;display:flex;align-items:center;justify-content:center" class="astro-j7pv25f6"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" class="astro-j7pv25f6"><path d="M12 3 L21 19 H3 Z" stroke="var(--broken)" stroke-width="1.75" class="astro-j7pv25f6"></path><path d="M12 9 V13 M12 16 V16.4" stroke="var(--broken)" stroke-width="1.75" stroke-linecap="round" class="astro-j7pv25f6"></path></svg></span><span style="font-family:var(--f-mono);font-size:12px;color:var(--mute-l)" class="astro-j7pv25f6">04</span> </div> <div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:8px" class="astro-j7pv25f6">Catch drift</div> <p style="font-size:14px;line-height:1.6;color:var(--dim-l);margin:0" class="astro-j7pv25f6">
|
|
54
|
+
The moment an agent or human drops or contradicts a requirement, the gate blocks the merge.
|
|
55
|
+
</p> </div> </div> </div> </section> <!-- ============ PRODUCT GLIMPSE ============ --> <section id="product" style="position:relative;overflow:hidden;border-bottom:1px solid var(--line-d)" class="astro-j7pv25f6"> <div style="position:absolute;inset:0;pointer-events:none;opacity:var(--grid-op);background-image:linear-gradient(rgba(255,255,255,0.045) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,0.045) 1px,transparent 1px);background-size:40px 40px" class="astro-j7pv25f6"></div> <div style="position:relative;max-width:1200px;margin:0 auto;padding:90px 28px" class="astro-j7pv25f6"> <div style="font-family:var(--f-mono);font-size:12px;letter-spacing:0.16em;color:var(--acc);margin-bottom:12px" class="astro-j7pv25f6">
|
|
56
|
+
THE SOURCE OF TRUTH
|
|
57
|
+
</div> <h2 style="font-family:var(--f-disp);font-weight:800;font-size:34px;letter-spacing:-0.025em;margin:0 0 8px" class="astro-j7pv25f6">
|
|
58
|
+
See every requirement's real status
|
|
59
|
+
</h2> <p style="font-size:16px;line-height:1.6;color:var(--dim-d);max-width:600px;margin:0 0 40px" class="astro-j7pv25f6">
|
|
60
|
+
One coverage matrix across the whole platform: who implemented each requirement in source, who verified it
|
|
61
|
+
with tests, and where it has drifted onto an outdated version.
|
|
62
|
+
</p> <div data-matrix style="border:1px solid var(--line-d);border-radius:11px;overflow:hidden;background:var(--panel);box-shadow:0 30px 60px rgba(0,0,0,0.45)" class="astro-j7pv25f6"> <div style="display:grid;grid-template-columns:1.4fr repeat(5,1fr) 96px;background:var(--charcoal);border-bottom:1px solid var(--line-d2)" class="astro-j7pv25f6"> <div style="padding:12px 18px;font-family:var(--f-mono);font-size:10px;letter-spacing:0.1em;color:var(--mute-d)" class="astro-j7pv25f6">
|
|
63
|
+
REQUIREMENT
|
|
64
|
+
</div> <div style="padding:12px 8px;text-align:center;font-family:var(--f-mono);font-size:11px;color:var(--dim-d);border-left:1px solid var(--line-d)" class="astro-j7pv25f6"> web </div><div style="padding:12px 8px;text-align:center;font-family:var(--f-mono);font-size:11px;color:var(--dim-d);border-left:1px solid var(--line-d)" class="astro-j7pv25f6"> api </div><div style="padding:12px 8px;text-align:center;font-family:var(--f-mono);font-size:11px;color:var(--dim-d);border-left:1px solid var(--line-d)" class="astro-j7pv25f6"> worker </div><div style="padding:12px 8px;text-align:center;font-family:var(--f-mono);font-size:11px;color:var(--dim-d);border-left:1px solid var(--line-d)" class="astro-j7pv25f6"> mobile </div><div style="padding:12px 8px;text-align:center;font-family:var(--f-mono);font-size:11px;color:var(--dim-d);border-left:1px solid var(--line-d)" class="astro-j7pv25f6"> cli </div> <div style="padding:12px 12px;text-align:right;font-family:var(--f-mono);font-size:10px;letter-spacing:0.1em;color:var(--mute-d);border-left:1px solid var(--line-d)" class="astro-j7pv25f6">
|
|
65
|
+
STATUS
|
|
66
|
+
</div> </div> <div style="display:grid;grid-template-columns:1.4fr repeat(5,1fr) 96px;border-bottom:1px solid var(--line-d);align-items:center" class="astro-j7pv25f6"> <div style="padding:13px 18px;display:flex;align-items:center;gap:11px;min-width:0" class="astro-j7pv25f6"> <span style="font-family:var(--f-mono);font-size:12px;color:var(--acc);flex:none" class="astro-j7pv25f6">SPEC-0011</span> <span style="font-size:13px;color:var(--fg-d);white-space:nowrap;overflow:hidden;text-overflow:ellipsis" class="astro-j7pv25f6"> Rate limit: 100 req / min / key </span> </div> <div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-j7pv25f6"> <span style="width:26px;height:26px;border-radius:4px;display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:13px;font-weight:700;line-height:1;color:var(--verified);background:var(--verified-soft);border:1px solid var(--verified-line)" class="astro-j7pv25f6">✓</span> </div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-j7pv25f6"> <span style="width:26px;height:26px;border-radius:4px;display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:13px;font-weight:700;line-height:1;color:var(--verified);background:var(--verified-soft);border:1px solid var(--verified-line)" class="astro-j7pv25f6">✓</span> </div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-j7pv25f6"> <span style="width:26px;height:26px;border-radius:4px;display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:13px;font-weight:700;line-height:1;color:var(--acc);background:var(--acc-soft);border:1px solid var(--acc-line)" class="astro-j7pv25f6">S</span> </div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-j7pv25f6"> <span style="width:26px;height:26px;border-radius:4px;display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:13px;font-weight:700;line-height:1;border:1px dashed var(--line-d2)" class="astro-j7pv25f6"></span> </div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-j7pv25f6"> <span style="width:26px;height:26px;border-radius:4px;display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:13px;font-weight:700;line-height:1;color:var(--verified);background:var(--verified-soft);border:1px solid var(--verified-line)" class="astro-j7pv25f6">✓</span> </div> <div style="border-left:1px solid var(--line-d);display:flex;justify-content:flex-end;padding:0 12px" class="astro-j7pv25f6"> <span style="font-family:var(--f-mono);font-size:10px;font-weight:600;letter-spacing:0.05em;justify-self:end;padding:4px 9px;border-radius:4px;color:var(--acc-ink);background:var(--acc)" class="astro-j7pv25f6">VERIFIED</span> </div> </div><div style="display:grid;grid-template-columns:1.4fr repeat(5,1fr) 96px;border-bottom:1px solid var(--line-d);align-items:center" class="astro-j7pv25f6"> <div style="padding:13px 18px;display:flex;align-items:center;gap:11px;min-width:0" class="astro-j7pv25f6"> <span style="font-family:var(--f-mono);font-size:12px;color:var(--acc);flex:none" class="astro-j7pv25f6">SPEC-0042</span> <span style="font-size:13px;color:var(--fg-d);white-space:nowrap;overflow:hidden;text-overflow:ellipsis" class="astro-j7pv25f6"> Refunds are idempotent </span> </div> <div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-j7pv25f6"> <span style="width:26px;height:26px;border-radius:4px;display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:13px;font-weight:700;line-height:1;border:1px dashed var(--line-d2)" class="astro-j7pv25f6"></span> </div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-j7pv25f6"> <span style="width:26px;height:26px;border-radius:4px;display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:13px;font-weight:700;line-height:1;color:var(--acc);background:var(--acc-soft);border:1px solid var(--acc-line)" class="astro-j7pv25f6">S</span> </div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-j7pv25f6"> <span style="width:26px;height:26px;border-radius:4px;display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:13px;font-weight:700;line-height:1;color:var(--verified);background:var(--verified-soft);border:1px solid var(--verified-line)" class="astro-j7pv25f6">✓</span> </div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-j7pv25f6"> <span style="width:26px;height:26px;border-radius:4px;display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:13px;font-weight:700;line-height:1;border:1px dashed var(--line-d2)" class="astro-j7pv25f6"></span> </div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-j7pv25f6"> <span style="width:26px;height:26px;border-radius:4px;display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:13px;font-weight:700;line-height:1;border:1px dashed var(--line-d2)" class="astro-j7pv25f6"></span> </div> <div style="border-left:1px solid var(--line-d);display:flex;justify-content:flex-end;padding:0 12px" class="astro-j7pv25f6"> <span style="font-family:var(--f-mono);font-size:10px;font-weight:600;letter-spacing:0.05em;justify-self:end;padding:4px 9px;border-radius:4px;color:var(--drift);background:color-mix(in srgb,var(--drift) 15%,transparent);border:1px solid color-mix(in srgb,var(--drift) 40%,transparent)" class="astro-j7pv25f6">DRIFT</span> </div> </div><div style="display:grid;grid-template-columns:1.4fr repeat(5,1fr) 96px;border-bottom:1px solid var(--line-d);align-items:center" class="astro-j7pv25f6"> <div style="padding:13px 18px;display:flex;align-items:center;gap:11px;min-width:0" class="astro-j7pv25f6"> <span style="font-family:var(--f-mono);font-size:12px;color:var(--acc);flex:none" class="astro-j7pv25f6">SPEC-0014</span> <span style="font-size:13px;color:var(--fg-d);white-space:nowrap;overflow:hidden;text-overflow:ellipsis" class="astro-j7pv25f6"> Exports scoped to the tenant </span> </div> <div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-j7pv25f6"> <span style="width:26px;height:26px;border-radius:4px;display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:13px;font-weight:700;line-height:1;color:var(--acc);background:var(--acc-soft);border:1px solid var(--acc-line)" class="astro-j7pv25f6">S</span> </div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-j7pv25f6"> <span style="width:26px;height:26px;border-radius:4px;display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:13px;font-weight:700;line-height:1;color:var(--verified);background:var(--verified-soft);border:1px solid var(--verified-line)" class="astro-j7pv25f6">✓</span> </div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-j7pv25f6"> <span style="width:26px;height:26px;border-radius:4px;display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:13px;font-weight:700;line-height:1;border:1px dashed var(--line-d2)" class="astro-j7pv25f6"></span> </div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-j7pv25f6"> <span style="width:26px;height:26px;border-radius:4px;display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:13px;font-weight:700;line-height:1;border:1px dashed var(--line-d2)" class="astro-j7pv25f6"></span> </div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-j7pv25f6"> <span style="width:26px;height:26px;border-radius:4px;display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:13px;font-weight:700;line-height:1;border:1px dashed var(--line-d2)" class="astro-j7pv25f6"></span> </div> <div style="border-left:1px solid var(--line-d);display:flex;justify-content:flex-end;padding:0 12px" class="astro-j7pv25f6"> <span style="font-family:var(--f-mono);font-size:10px;font-weight:600;letter-spacing:0.05em;justify-self:end;padding:4px 9px;border-radius:4px;color:var(--broken);background:color-mix(in srgb,var(--broken) 15%,transparent);border:1px solid color-mix(in srgb,var(--broken) 40%,transparent)" class="astro-j7pv25f6">BROKEN</span> </div> </div><div style="display:grid;grid-template-columns:1.4fr repeat(5,1fr) 96px;border-bottom:1px solid var(--line-d);align-items:center" class="astro-j7pv25f6"> <div style="padding:13px 18px;display:flex;align-items:center;gap:11px;min-width:0" class="astro-j7pv25f6"> <span style="font-family:var(--f-mono);font-size:12px;color:var(--acc);flex:none" class="astro-j7pv25f6">SPEC-0002</span> <span style="font-size:13px;color:var(--fg-d);white-space:nowrap;overflow:hidden;text-overflow:ellipsis" class="astro-j7pv25f6"> PII never logged in plaintext </span> </div> <div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-j7pv25f6"> <span style="width:26px;height:26px;border-radius:4px;display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:13px;font-weight:700;line-height:1;color:var(--verified);background:var(--verified-soft);border:1px solid var(--verified-line)" class="astro-j7pv25f6">✓</span> </div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-j7pv25f6"> <span style="width:26px;height:26px;border-radius:4px;display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:13px;font-weight:700;line-height:1;color:var(--verified);background:var(--verified-soft);border:1px solid var(--verified-line)" class="astro-j7pv25f6">✓</span> </div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-j7pv25f6"> <span style="width:26px;height:26px;border-radius:4px;display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:13px;font-weight:700;line-height:1;color:var(--verified);background:var(--verified-soft);border:1px solid var(--verified-line)" class="astro-j7pv25f6">✓</span> </div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-j7pv25f6"> <span style="width:26px;height:26px;border-radius:4px;display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:13px;font-weight:700;line-height:1;color:var(--verified);background:var(--verified-soft);border:1px solid var(--verified-line)" class="astro-j7pv25f6">✓</span> </div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-j7pv25f6"> <span style="width:26px;height:26px;border-radius:4px;display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:13px;font-weight:700;line-height:1;color:var(--acc);background:var(--acc-soft);border:1px solid var(--acc-line)" class="astro-j7pv25f6">S</span> </div> <div style="border-left:1px solid var(--line-d);display:flex;justify-content:flex-end;padding:0 12px" class="astro-j7pv25f6"> <span style="font-family:var(--f-mono);font-size:10px;font-weight:600;letter-spacing:0.05em;justify-self:end;padding:4px 9px;border-radius:4px;color:var(--acc-ink);background:var(--acc)" class="astro-j7pv25f6">VERIFIED</span> </div> </div> <div style="display:flex;gap:18px;padding:13px 18px;font-family:var(--f-mono);font-size:11px;color:var(--dim-d);flex-wrap:wrap" class="astro-j7pv25f6"> <span style="display:flex;align-items:center;gap:7px" class="astro-j7pv25f6"> <span style="width:16px;height:16px;border-radius:3px;display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:10px;font-weight:700;line-height:1;color:var(--verified);background:var(--verified-soft);border:1px solid var(--verified-line)" class="astro-j7pv25f6">✓</span> verified </span><span style="display:flex;align-items:center;gap:7px" class="astro-j7pv25f6"> <span style="width:16px;height:16px;border-radius:3px;display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:10px;font-weight:700;line-height:1;color:var(--acc);background:var(--acc-soft);border:1px solid var(--acc-line)" class="astro-j7pv25f6">S</span> src only </span><span style="display:flex;align-items:center;gap:7px" class="astro-j7pv25f6"> <span style="width:16px;height:16px;border-radius:3px;display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:10px;font-weight:700;line-height:1;color:var(--acc);border:1px solid var(--acc-line)" class="astro-j7pv25f6">T</span> test only </span><span style="display:flex;align-items:center;gap:7px" class="astro-j7pv25f6"> <span style="width:16px;height:16px;border-radius:3px;display:flex;align-items:center;justify-content:center;font-family:var(--f-mono);font-size:10px;font-weight:700;line-height:1;border:1px dashed var(--line-d2)" class="astro-j7pv25f6"></span> none </span> </div> </div> </div> </section> <!-- ============ PLATFORM CONSISTENCY ============ --> <section style="background:var(--bone);color:var(--fg-l);border-bottom:1px solid var(--line-l)" class="astro-j7pv25f6"> <div style="max-width:1200px;margin:0 auto;padding:90px 28px" class="astro-j7pv25f6"> <div style="font-family:var(--f-mono);font-size:12px;letter-spacing:0.16em;color:var(--mute-l);margin-bottom:12px" class="astro-j7pv25f6">
|
|
67
|
+
PLATFORM-WIDE CONSISTENCY
|
|
68
|
+
</div> <h2 style="font-family:var(--f-disp);font-weight:800;font-size:clamp(28px,3.6vw,42px);letter-spacing:-0.025em;line-height:1.05;margin:0 0 20px" class="astro-j7pv25f6">
|
|
69
|
+
One requirement. Every surface.
|
|
70
|
+
</h2> <div data-stack style="display:grid;grid-template-columns:1fr 1fr;gap:44px;align-items:start" class="astro-j7pv25f6"> <p style="font-size:16px;line-height:1.65;color:var(--dim-l);margin:0" class="astro-j7pv25f6">
|
|
71
|
+
Changes used to be filed per service: an issue for the API, one for the web app, one for mobile. Then you
|
|
72
|
+
forget the internal admin and the support tools. Then the customer portal, and now it's broken.
|
|
73
|
+
</p> <p style="font-family:var(--f-disp);font-weight:800;font-size:clamp(22px,2.6vw,30px);letter-spacing:-0.02em;line-height:1.15;margin:0;color:var(--fg-l)" class="astro-j7pv25f6">
|
|
74
|
+
Not with <span style="background:var(--acc);color:var(--acc-ink);padding:0 8px" class="astro-j7pv25f6">Spec Engine</span>.
|
|
75
|
+
</p> </div> <div data-stack style="display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-top:44px" class="astro-j7pv25f6"> <!-- old way --> <div style="border:1px solid var(--line-l);border-radius:11px;overflow:hidden;background:var(--paper)" class="astro-j7pv25f6"> <div style="padding:14px 20px;border-bottom:1px solid var(--line-l);font-family:var(--f-mono);font-size:11px;letter-spacing:0.1em;color:var(--mute-l)" class="astro-j7pv25f6">
|
|
76
|
+
THE OLD WAY · ONE TICKET PER SERVICE
|
|
77
|
+
</div> <div style="padding:8px 20px" class="astro-j7pv25f6"> <div style="display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px solid var(--line-l)" class="astro-j7pv25f6"> <span style="font-size:14px;color:var(--fg-l);flex:1" class="astro-j7pv25f6">API</span><span style="font-family:var(--f-mono);font-size:11px;color:var(--dim-l)" class="astro-j7pv25f6">ISSUE-2101</span><span style="font-family:var(--f-mono);font-size:10px;color:var(--mute-l);width:96px;text-align:right" class="astro-j7pv25f6">filed</span> </div> <div style="display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px solid var(--line-l)" class="astro-j7pv25f6"> <span style="font-size:14px;color:var(--fg-l);flex:1" class="astro-j7pv25f6">Web app</span><span style="font-family:var(--f-mono);font-size:11px;color:var(--dim-l)" class="astro-j7pv25f6">ISSUE-2102</span><span style="font-family:var(--f-mono);font-size:10px;color:var(--mute-l);width:96px;text-align:right" class="astro-j7pv25f6">filed</span> </div> <div style="display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px solid var(--line-l)" class="astro-j7pv25f6"> <span style="font-size:14px;color:var(--fg-l);flex:1" class="astro-j7pv25f6">Mobile</span><span style="font-family:var(--f-mono);font-size:11px;color:var(--dim-l)" class="astro-j7pv25f6">ISSUE-2103</span><span style="font-family:var(--f-mono);font-size:10px;color:var(--mute-l);width:96px;text-align:right" class="astro-j7pv25f6">filed</span> </div> <div style="display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px solid var(--line-l);opacity:0.6" class="astro-j7pv25f6"> <span style="font-size:14px;color:var(--fg-l);flex:1" class="astro-j7pv25f6">Internal admin</span><span style="font-family:var(--f-mono);font-size:11px;color:var(--mute-l)" class="astro-j7pv25f6">—</span><span style="font-family:var(--f-mono);font-size:10px;color:var(--mute-l);width:96px;text-align:right" class="astro-j7pv25f6">forgotten</span> </div> <div style="display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px solid var(--line-l);opacity:0.6" class="astro-j7pv25f6"> <span style="font-size:14px;color:var(--fg-l);flex:1" class="astro-j7pv25f6">Support tools</span><span style="font-family:var(--f-mono);font-size:11px;color:var(--mute-l)" class="astro-j7pv25f6">—</span><span style="font-family:var(--f-mono);font-size:10px;color:var(--mute-l);width:96px;text-align:right" class="astro-j7pv25f6">forgotten</span> </div> <div style="display:flex;align-items:center;gap:12px;padding:11px 0" class="astro-j7pv25f6"> <span style="font-size:14px;color:var(--fg-l);flex:1" class="astro-j7pv25f6">Customer portal</span><span style="font-family:var(--f-mono);font-size:11px;color:var(--broken)" class="astro-j7pv25f6">—</span><span style="font-family:var(--f-mono);font-size:10px;font-weight:600;color:var(--broken);width:96px;text-align:right" class="astro-j7pv25f6">SHIPPED BROKEN</span> </div> </div> </div> <!-- spec engine way --> <div style="border:1px solid var(--acc-line);border-radius:11px;overflow:hidden;background:var(--ink);color:var(--fg-d)" class="astro-j7pv25f6"> <div style="padding:14px 20px;border-bottom:1px solid var(--line-d);display:flex;align-items:center;gap:10px" class="astro-j7pv25f6"> <span style="font-family:var(--f-mono);font-size:13px;color:var(--acc)" class="astro-j7pv25f6">[SPEC-0042]</span><span style="font-size:13px;color:var(--fg-d)" class="astro-j7pv25f6">Refunds are idempotent</span> </div> <div style="padding:8px 20px" class="astro-j7pv25f6"> <div style="display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px solid var(--line-d)" class="astro-j7pv25f6"> <span style="width:18px;height:18px;border-radius:4px;background:var(--verified-soft);border:1px solid var(--verified-line);display:flex;align-items:center;justify-content:center;flex:none" class="astro-j7pv25f6"> <svg width="11" height="11" viewBox="0 0 24 24" fill="none" class="astro-j7pv25f6"> <path d="M5 12 L10 17 L19 6" stroke="var(--verified)" stroke-width="2.6" class="astro-j7pv25f6"></path> </svg> </span> <span style="font-size:14px;color:var(--fg-d);flex:1" class="astro-j7pv25f6">API</span> <span style="font-family:var(--f-mono);font-size:10px;font-weight:600;color:var(--verified);width:96px;text-align:right" class="astro-j7pv25f6">
|
|
78
|
+
VERIFIED
|
|
79
|
+
</span> </div><div style="display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px solid var(--line-d)" class="astro-j7pv25f6"> <span style="width:18px;height:18px;border-radius:4px;background:var(--verified-soft);border:1px solid var(--verified-line);display:flex;align-items:center;justify-content:center;flex:none" class="astro-j7pv25f6"> <svg width="11" height="11" viewBox="0 0 24 24" fill="none" class="astro-j7pv25f6"> <path d="M5 12 L10 17 L19 6" stroke="var(--verified)" stroke-width="2.6" class="astro-j7pv25f6"></path> </svg> </span> <span style="font-size:14px;color:var(--fg-d);flex:1" class="astro-j7pv25f6">Web app</span> <span style="font-family:var(--f-mono);font-size:10px;font-weight:600;color:var(--verified);width:96px;text-align:right" class="astro-j7pv25f6">
|
|
80
|
+
VERIFIED
|
|
81
|
+
</span> </div><div style="display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px solid var(--line-d)" class="astro-j7pv25f6"> <span style="width:18px;height:18px;border-radius:4px;background:var(--verified-soft);border:1px solid var(--verified-line);display:flex;align-items:center;justify-content:center;flex:none" class="astro-j7pv25f6"> <svg width="11" height="11" viewBox="0 0 24 24" fill="none" class="astro-j7pv25f6"> <path d="M5 12 L10 17 L19 6" stroke="var(--verified)" stroke-width="2.6" class="astro-j7pv25f6"></path> </svg> </span> <span style="font-size:14px;color:var(--fg-d);flex:1" class="astro-j7pv25f6">Mobile</span> <span style="font-family:var(--f-mono);font-size:10px;font-weight:600;color:var(--verified);width:96px;text-align:right" class="astro-j7pv25f6">
|
|
82
|
+
VERIFIED
|
|
83
|
+
</span> </div><div style="display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px solid var(--line-d)" class="astro-j7pv25f6"> <span style="width:18px;height:18px;border-radius:4px;background:var(--verified-soft);border:1px solid var(--verified-line);display:flex;align-items:center;justify-content:center;flex:none" class="astro-j7pv25f6"> <svg width="11" height="11" viewBox="0 0 24 24" fill="none" class="astro-j7pv25f6"> <path d="M5 12 L10 17 L19 6" stroke="var(--verified)" stroke-width="2.6" class="astro-j7pv25f6"></path> </svg> </span> <span style="font-size:14px;color:var(--fg-d);flex:1" class="astro-j7pv25f6">Internal admin</span> <span style="font-family:var(--f-mono);font-size:10px;font-weight:600;color:var(--verified);width:96px;text-align:right" class="astro-j7pv25f6">
|
|
84
|
+
VERIFIED
|
|
85
|
+
</span> </div><div style="display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px solid var(--line-d)" class="astro-j7pv25f6"> <span style="width:18px;height:18px;border-radius:4px;background:var(--verified-soft);border:1px solid var(--verified-line);display:flex;align-items:center;justify-content:center;flex:none" class="astro-j7pv25f6"> <svg width="11" height="11" viewBox="0 0 24 24" fill="none" class="astro-j7pv25f6"> <path d="M5 12 L10 17 L19 6" stroke="var(--verified)" stroke-width="2.6" class="astro-j7pv25f6"></path> </svg> </span> <span style="font-size:14px;color:var(--fg-d);flex:1" class="astro-j7pv25f6">Support tools</span> <span style="font-family:var(--f-mono);font-size:10px;font-weight:600;color:var(--verified);width:96px;text-align:right" class="astro-j7pv25f6">
|
|
86
|
+
VERIFIED
|
|
87
|
+
</span> </div><div style="display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px solid var(--line-d)" class="astro-j7pv25f6"> <span style="width:18px;height:18px;border-radius:4px;background:var(--verified-soft);border:1px solid var(--verified-line);display:flex;align-items:center;justify-content:center;flex:none" class="astro-j7pv25f6"> <svg width="11" height="11" viewBox="0 0 24 24" fill="none" class="astro-j7pv25f6"> <path d="M5 12 L10 17 L19 6" stroke="var(--verified)" stroke-width="2.6" class="astro-j7pv25f6"></path> </svg> </span> <span style="font-size:14px;color:var(--fg-d);flex:1" class="astro-j7pv25f6">Customer portal</span> <span style="font-family:var(--f-mono);font-size:10px;font-weight:600;color:var(--verified);width:96px;text-align:right" class="astro-j7pv25f6">
|
|
88
|
+
VERIFIED
|
|
89
|
+
</span> </div> </div> <div style="padding:14px 20px;border-top:1px solid var(--line-d);font-family:var(--f-mono);font-size:11px;color:var(--mute-d)" class="astro-j7pv25f6">
|
|
90
|
+
one spec · every surface bound and verified · nothing forgotten
|
|
91
|
+
</div> </div> </div> </div> </section> <!-- ============ DRIFT GATE ============ --> <section id="drift" style="background:var(--bone);color:var(--fg-l);border-bottom:1px solid var(--line-l)" class="astro-j7pv25f6"> <div data-stack style="max-width:1200px;margin:0 auto;display:grid;grid-template-columns:1fr 1fr;gap:52px;align-items:center;padding:90px 28px" class="astro-j7pv25f6"> <div class="astro-j7pv25f6"> <div style="font-family:var(--f-mono);font-size:12px;letter-spacing:0.16em;color:var(--mute-l);margin-bottom:12px" class="astro-j7pv25f6">
|
|
92
|
+
DRIFT GATE
|
|
93
|
+
</div> <h2 style="font-family:var(--f-disp);font-weight:800;font-size:clamp(28px,3.4vw,40px);letter-spacing:-0.025em;line-height:1.08;margin:0 0 18px" class="astro-j7pv25f6">
|
|
94
|
+
Catch drift before it ships.
|
|
95
|
+
</h2> <p style="font-size:17px;line-height:1.5;color:var(--fg-l);font-weight:600;margin:0 0 18px;max-width:520px" class="astro-j7pv25f6">
|
|
96
|
+
Don't let your agent gaslight you into thinking you never wrote the requirement.
|
|
97
|
+
</p> <p style="font-size:16px;line-height:1.6;color:var(--dim-l);margin:0 0 18px;max-width:520px" class="astro-j7pv25f6">
|
|
98
|
+
A requirement that quietly disappears without being superseded is indistinguishable from an agent dropping
|
|
99
|
+
it. Agents can't tell intent from accident, so the CI gate holds the merge, and the audit trail shows
|
|
100
|
+
exactly who wrote it and when.
|
|
101
|
+
</p> <p style="font-size:16px;line-height:1.6;color:var(--dim-l);margin:0;max-width:520px" class="astro-j7pv25f6">
|
|
102
|
+
Supersession is what lets every agent on the platform tell <span style="color:var(--fg-l);font-weight:600" class="astro-j7pv25f6">drift</span> apart from <span style="color:var(--fg-l);font-weight:600" class="astro-j7pv25f6">intention</span>.
|
|
103
|
+
</p> </div> <div style="background:var(--ink);border:1px solid color-mix(in srgb,var(--broken) 40%,transparent);border-radius:11px;overflow:hidden;box-shadow:0 24px 50px rgba(0,0,0,0.3)" class="astro-j7pv25f6"> <div style="display:flex;align-items:center;gap:11px;padding:15px 18px;border-bottom:1px solid var(--line-d);background:color-mix(in srgb,var(--broken) 12%,var(--ink))" class="astro-j7pv25f6"> <svg width="17" height="17" viewBox="0 0 24 24" fill="none" class="astro-j7pv25f6"><path d="M12 3 L21 19 H3 Z" stroke="var(--broken)" stroke-width="1.75" class="astro-j7pv25f6"></path><path d="M12 9 V13 M12 16 V16.3" stroke="var(--broken)" stroke-width="1.75" stroke-linecap="round" class="astro-j7pv25f6"></path></svg> <span style="font-family:var(--f-disp);font-weight:800;font-size:15px;color:var(--broken)" class="astro-j7pv25f6">MERGE BLOCKED</span> <span style="flex:1" class="astro-j7pv25f6"></span> <span style="font-family:var(--f-mono);font-size:11px;color:var(--mute-d)" class="astro-j7pv25f6">PR #482</span> </div> <div style="padding:18px;font-family:var(--f-mono);font-size:12.5px;line-height:1.9" class="astro-j7pv25f6"> <div style="color:var(--mute-d)" class="astro-j7pv25f6">specs/billing.spec.md</div> <div style="color:var(--broken)" class="astro-j7pv25f6">− ## [SPEC-0042] Refunds are idempotent</div> <div style="color:var(--mute-d);margin-top:6px" class="astro-j7pv25f6">worker/refunds/handler.ts</div> <div style="color:var(--broken)" class="astro-j7pv25f6">− // @spec(SPEC-0042)</div> </div> <div style="border-top:1px solid var(--line-d);padding:14px 18px;font-family:var(--f-mono);font-size:12px;color:var(--dim-d)" class="astro-j7pv25f6">
|
|
104
|
+
no <span style="color:var(--acc)" class="astro-j7pv25f6">supersedes</span> record found · <span style="color:var(--broken)" class="astro-j7pv25f6">silent drop</span> </div> </div> </div> </section> <!-- ============ FEATURES ============ --> <section id="features" style="background:var(--ink);border-bottom:1px solid var(--line-d)" class="astro-j7pv25f6"> <div style="max-width:1200px;margin:0 auto;padding:90px 28px" class="astro-j7pv25f6"> <div style="font-family:var(--f-mono);font-size:12px;letter-spacing:0.16em;color:var(--acc);margin-bottom:12px" class="astro-j7pv25f6">
|
|
105
|
+
WHAT YOU GET
|
|
106
|
+
</div> <h2 style="font-family:var(--f-disp);font-weight:800;font-size:34px;letter-spacing:-0.025em;margin:0 0 14px" class="astro-j7pv25f6">
|
|
107
|
+
The precision of a principal engineer
|
|
108
|
+
</h2> <p style="font-size:16px;line-height:1.6;color:var(--dim-d);max-width:560px;margin:0 0 44px" class="astro-j7pv25f6">
|
|
109
|
+
For people who know exactly what they want. You set the requirement; Spec Engine holds everyone to it,
|
|
110
|
+
agent or human.
|
|
111
|
+
</p> <div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:1px;background:var(--line-d);border:1px solid var(--line-d)" class="astro-j7pv25f6"> <div style="background:var(--panel);padding:28px 26px" class="astro-j7pv25f6"> <div style="font-family:var(--f-mono);font-size:13px;color:var(--acc);margin-bottom:12px" class="astro-j7pv25f6">[ ID ]</div> <div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:8px" class="astro-j7pv25f6">Permanent IDs</div> <p style="font-size:14px;line-height:1.6;color:var(--dim-d);margin:0" class="astro-j7pv25f6">
|
|
112
|
+
Every requirement gets a stable identifier that survives renames, refactors, and rewrites.
|
|
113
|
+
</p> </div> <div style="background:var(--panel);padding:28px 26px" class="astro-j7pv25f6"> <div style="font-family:var(--f-mono);font-size:13px;color:var(--acc);margin-bottom:12px" class="astro-j7pv25f6">spec → code</div> <div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:8px" class="astro-j7pv25f6">
|
|
114
|
+
Cross-repo bindings
|
|
115
|
+
</div> <p style="font-size:14px;line-height:1.6;color:var(--dim-d);margin:0" class="astro-j7pv25f6">
|
|
116
|
+
One requirement, bound to its implementation and tests across every repo in the platform.
|
|
117
|
+
</p> </div> <div style="background:var(--panel);padding:28px 26px" class="astro-j7pv25f6"> <div style="font-family:var(--f-mono);font-size:13px;color:var(--acc);margin-bottom:12px" class="astro-j7pv25f6">CI gate</div> <div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:8px" class="astro-j7pv25f6">Drift caught in CI</div> <p style="font-size:14px;line-height:1.6;color:var(--dim-d);margin:0" class="astro-j7pv25f6">
|
|
118
|
+
Silent drops and contradictions block the merge before they reach production.
|
|
119
|
+
</p> </div> <div style="background:var(--panel);padding:28px 26px" class="astro-j7pv25f6"> <div style="font-family:var(--f-mono);font-size:13px;color:var(--acc);margin-bottom:12px" class="astro-j7pv25f6">4 states</div> <div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:8px" class="astro-j7pv25f6">One clear status</div> <p style="font-size:14px;line-height:1.6;color:var(--dim-d);margin:0" class="astro-j7pv25f6">
|
|
120
|
+
Verified, drift, broken, or unbound. Deterministic, never a guess.
|
|
121
|
+
</p> </div> <div style="background:var(--panel);padding:28px 26px" class="astro-j7pv25f6"> <div style="font-family:var(--f-mono);font-size:13px;color:var(--acc);margin-bottom:12px" class="astro-j7pv25f6">v1 → v4</div> <div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:8px" class="astro-j7pv25f6">
|
|
122
|
+
Versions & audit trail
|
|
123
|
+
</div> <p style="font-size:14px;line-height:1.6;color:var(--dim-d);margin:0" class="astro-j7pv25f6">
|
|
124
|
+
Amendments mint versions and mark predecessors superseded. Full history, who and when.
|
|
125
|
+
</p> </div> <div style="background:var(--panel);padding:28px 26px" class="astro-j7pv25f6"> <div style="font-family:var(--f-mono);font-size:13px;color:var(--acc);margin-bottom:12px" class="astro-j7pv25f6">agents</div> <div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:8px" class="astro-j7pv25f6">Agent-coherent</div> <p style="font-size:14px;line-height:1.6;color:var(--dim-d);margin:0" class="astro-j7pv25f6">
|
|
126
|
+
Agents building on the platform stay on-spec instead of wandering off it.
|
|
127
|
+
</p> </div> </div> </div> </section> <!-- ============ WHO IT'S FOR ============ --> <section style="background:var(--bone);color:var(--fg-l);border-bottom:1px solid var(--line-l)" class="astro-j7pv25f6"> <div style="max-width:1200px;margin:0 auto;padding:90px 28px" class="astro-j7pv25f6"> <div style="font-family:var(--f-mono);font-size:12px;letter-spacing:0.16em;color:var(--mute-l);margin-bottom:12px" class="astro-j7pv25f6">
|
|
128
|
+
WHO IT'S FOR
|
|
129
|
+
</div> <h2 style="font-family:var(--f-disp);font-weight:800;font-size:34px;letter-spacing:-0.025em;margin:0 0 8px" class="astro-j7pv25f6">
|
|
130
|
+
For anyone who owns an outcome
|
|
131
|
+
</h2> <p style="font-size:16px;line-height:1.6;color:var(--dim-l);max-width:600px;margin:0 0 44px" class="astro-j7pv25f6">
|
|
132
|
+
If you decide what the product must do, or you have to prove it does, Spec Engine keeps everyone honest to
|
|
133
|
+
it.
|
|
134
|
+
</p> <div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:1px;background:var(--line-l);border:1px solid var(--line-l)" class="astro-j7pv25f6"> <div style="background:var(--paper);padding:28px 26px" class="astro-j7pv25f6"> <div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:9px" class="astro-j7pv25f6">Developers</div> <p style="font-size:14px;line-height:1.6;color:var(--dim-l);margin:0" class="astro-j7pv25f6">
|
|
135
|
+
Prove what you built satisfies the requirement, without writing a status update.
|
|
136
|
+
</p> </div> <div style="background:var(--paper);padding:28px 26px" class="astro-j7pv25f6"> <div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:9px" class="astro-j7pv25f6">Vibe coders</div> <p style="font-size:14px;line-height:1.6;color:var(--dim-l);margin:0" class="astro-j7pv25f6">
|
|
137
|
+
Ship fast with an agent and still know the moment something quietly broke.
|
|
138
|
+
</p> </div> <div style="background:var(--paper);padding:28px 26px" class="astro-j7pv25f6"> <div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:9px" class="astro-j7pv25f6">Agencies</div> <p style="font-size:14px;line-height:1.6;color:var(--dim-l);margin:0" class="astro-j7pv25f6">
|
|
139
|
+
Hand off a codebase where every client requirement is traceable to the code that meets it.
|
|
140
|
+
</p> </div> <div style="background:var(--paper);padding:28px 26px" class="astro-j7pv25f6"> <div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:9px" class="astro-j7pv25f6">Product managers</div> <p style="font-size:14px;line-height:1.6;color:var(--dim-l);margin:0" class="astro-j7pv25f6">
|
|
141
|
+
Watch requirements stay true across every surface, long after the PRD goes stale.
|
|
142
|
+
</p> </div> <div style="background:var(--paper);padding:28px 26px" class="astro-j7pv25f6"> <div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:9px" class="astro-j7pv25f6">Business analysts</div> <p style="font-size:14px;line-height:1.6;color:var(--dim-l);margin:0" class="astro-j7pv25f6">
|
|
143
|
+
Write a requirement once and see exactly where it lives in the product.
|
|
144
|
+
</p> </div> <div style="background:var(--paper);padding:28px 26px" class="astro-j7pv25f6"> <div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:9px" class="astro-j7pv25f6">QA</div> <p style="font-size:14px;line-height:1.6;color:var(--dim-l);margin:0" class="astro-j7pv25f6">
|
|
145
|
+
Know which requirements are verified by tests, and which only claim to be.
|
|
146
|
+
</p> </div> </div> </div> </section> <!-- ============ CTA ============ --> <section id="cta" style="position:relative;overflow:hidden;border-bottom:1px solid var(--line-d)" class="astro-j7pv25f6"> <div style="position:absolute;inset:0;pointer-events:none;opacity:var(--grid-op);background-image:linear-gradient(rgba(255,255,255,0.045) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,0.045) 1px,transparent 1px);background-size:40px 40px" class="astro-j7pv25f6"></div> <div style="position:relative;max-width:900px;margin:0 auto;text-align:center;padding:100px 28px" class="astro-j7pv25f6"> <svg width="52" height="52" viewBox="0 0 64 64" fill="none" style="margin-bottom:26px" class="astro-j7pv25f6"><path d="M25 13 H13 V51 H25" stroke="var(--fg-d)" stroke-width="5.5" class="astro-j7pv25f6"></path><path d="M39 13 H51 V51 H39" stroke="var(--fg-d)" stroke-width="5.5" class="astro-j7pv25f6"></path><rect x="26" y="26" width="12" height="12" fill="var(--acc)" class="astro-j7pv25f6"></rect><line x1="32" y1="13" x2="32" y2="24" stroke="var(--fg-d)" stroke-width="4" class="astro-j7pv25f6"></line><line x1="32" y1="40" x2="32" y2="51" stroke="var(--fg-d)" stroke-width="4" class="astro-j7pv25f6"></line></svg> <h2 style="font-family:var(--f-disp);font-weight:900;font-size:clamp(34px,5vw,56px);letter-spacing:-0.03em;line-height:1;margin:0" class="astro-j7pv25f6">
|
|
147
|
+
The spec is the source of truth.
|
|
148
|
+
</h2> <p style="font-size:18px;line-height:1.6;color:var(--dim-d);max-width:520px;margin:22px auto 0" class="astro-j7pv25f6">
|
|
149
|
+
Requirements that outlive features. Drift caught before it ships. Agents that stay honest.
|
|
150
|
+
</p> <div style="display:flex;gap:13px;justify-content:center;margin-top:34px;flex-wrap:wrap" class="astro-j7pv25f6"> <a href="https://github.com/spec-engine/spec-engine" class="btn-acc astro-j7pv25f6" style="display:inline-flex;align-items:center;gap:10px;font-family:var(--f-disp);font-weight:700;font-size:15px;background:var(--acc);color:var(--acc-ink);border-radius:7px;padding:14px 26px"><svg width="17" height="17" viewBox="0 0 16 16" fill="currentColor" style="flex:none" class="astro-j7pv25f6"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.65-.89-3.65-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.13 0 0 .67-.21 2.2.82a7.6 7.6 0 012-.27c.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.11.16 1.93.08 2.13.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8 8 0 008 0z" class="astro-j7pv25f6"></path></svg>Start free</a> <a href="#" class="btn-ghost astro-j7pv25f6" style="font-family:var(--f-disp);font-weight:700;font-size:15px;color:var(--fg-d);border:1.5px solid var(--line-d2);border-radius:7px;padding:13px 26px">Book a demo</a> </div> </div> </section> <!-- ============ FOOTER ============ --> <footer style="background:var(--ink);padding:40px 28px" class="astro-j7pv25f6"> <div style="max-width:1200px;margin:0 auto;display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:16px" class="astro-j7pv25f6"> <div style="display:flex;align-items:center;gap:10px" class="astro-j7pv25f6"> <svg width="20" height="20" viewBox="0 0 64 64" fill="none" class="astro-j7pv25f6"><path d="M25 13 H13 V51 H25" stroke="var(--fg-d)" stroke-width="6" class="astro-j7pv25f6"></path><path d="M39 13 H51 V51 H39" stroke="var(--fg-d)" stroke-width="6" class="astro-j7pv25f6"></path><rect x="26" y="26" width="12" height="12" fill="var(--acc)" class="astro-j7pv25f6"></rect><line x1="32" y1="13" x2="32" y2="24" stroke="var(--fg-d)" stroke-width="4" class="astro-j7pv25f6"></line><line x1="32" y1="40" x2="32" y2="51" stroke="var(--fg-d)" stroke-width="4" class="astro-j7pv25f6"></line></svg> <span style="font-family:var(--f-disp);font-weight:800;font-size:14px;color:var(--fg-d)" class="astro-j7pv25f6">Spec Engine</span> </div> <div style="display:flex;gap:24px;font-size:13px;color:var(--dim-d)" class="astro-j7pv25f6"> <a href="/overview/" class="hov-fg astro-j7pv25f6" style="color:var(--dim-d)">Docs</a> <a href="#" class="hov-fg astro-j7pv25f6" style="color:var(--dim-d)">Pricing</a> <a href="#" class="hov-fg astro-j7pv25f6" style="color:var(--dim-d)">Changelog</a> <a href="https://github.com/spec-engine/spec-engine" class="hov-fg astro-j7pv25f6" style="color:var(--dim-d)">GitHub</a> </div> <span style="display:flex;align-items:center;gap:14px;font-family:var(--f-mono);font-size:11px;color:var(--mute-d);letter-spacing:0.05em" class="astro-j7pv25f6"> <span style="display:flex;align-items:center;gap:6px" class="astro-j7pv25f6">Made with <svg width="12" height="12" viewBox="0 0 24 24" fill="var(--acc)" style="flex:none" class="astro-j7pv25f6"><path d="M12 21 C12 21 3 14.5 3 8.5 A4.5 4.5 0 0112 6 A4.5 4.5 0 0121 8.5 C21 14.5 12 21 12 21 Z" class="astro-j7pv25f6"></path></svg> from the heart of Indiana</span> <span style="width:1px;height:12px;background:var(--line-d2)" class="astro-j7pv25f6"></span>
|
|
151
|
+
© 2026 · SPEC-0000
|
|
152
|
+
</span> </div> </footer> <!-- mobile floating CTA --> <div data-mobile-bar style="display:none;position:fixed;left:0;right:0;bottom:0;z-index:60;padding:12px 16px calc(12px + env(safe-area-inset-bottom));background:color-mix(in srgb,var(--ink) 92%,transparent);backdrop-filter:blur(12px);border-top:1px solid var(--line-d)" class="astro-j7pv25f6"> <a href="https://github.com/spec-engine/spec-engine" class="btn-acc astro-j7pv25f6" style="display:flex;align-items:center;justify-content:center;gap:9px;width:100%;font-family:var(--f-disp);font-weight:700;font-size:16px;background:var(--acc);color:var(--acc-ink);border-radius:9px;padding:15px"><svg width="18" height="18" viewBox="0 0 16 16" fill="currentColor" style="flex:none" class="astro-j7pv25f6"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.65-.89-3.65-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.13 0 0 .67-.21 2.2.82a7.6 7.6 0 012-.27c.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.11.16 1.93.08 2.13.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8 8 0 008 0z" class="astro-j7pv25f6"></path></svg>Start free with GitHub</a> </div> </div> <script type="module">const e=document.getElementById("quickstart-copy");e?.addEventListener("click",()=>{const t=document.getElementById("quickstart-cmd")?.textContent??"";navigator.clipboard?.writeText(t.trim())});</script> </body> </html>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
<!DOCTYPE html><html lang="en" dir="ltr" data-theme="dark" data-has-toc data-has-sidebar class="astro-hke2hksx"> <head><meta charset="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>Overview | Spec Engine</title><link rel="canonical" href="https://docs.spec-engine.dev/overview/"/><link rel="sitemap" href="/sitemap-index.xml"/><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="true"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Archivo:wght@600;700;800;900&family=IBM+Plex+Mono:wght@400;500;600&family=IBM+Plex+Sans:wght@400;500;600&display=swap"/><link rel="icon" href="/favicon.ico" sizes="any"/><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png"/><link rel="icon" type="image/png" sizes="16x16" href="/favicon-16.png"/><link rel="apple-touch-icon" sizes="180x180" href="/favicon-180.png"/><link rel="manifest" href="/site.webmanifest"/><link rel="shortcut icon" href="/favicon.svg" type="image/svg+xml"/><meta name="generator" content="Astro v6.4.8"/><meta name="generator" content="Starlight v0.40.0"/><meta property="og:title" content="Overview"/><meta property="og:type" content="article"/><meta property="og:url" content="https://docs.spec-engine.dev/overview/"/><meta property="og:locale" content="en"/><meta property="og:description" content="What Spec Engine is and why it exists"/><meta property="og:site_name" content="Spec Engine"/><meta name="twitter:card" content="summary_large_image"/><meta name="description" content="What Spec Engine is and why it exists"/><meta name="theme-color" content="#0F1214"/><meta property="og:image" content="https://docs.spec-engine.dev/og-spec-engine-docs.png"/><meta property="og:image:width" content="1200"/><meta property="og:image:height" content="630"/><meta name="twitter:image" content="https://docs.spec-engine.dev/og-spec-engine-docs.png"/><script>
|
|
2
|
+
window.StarlightThemeProvider = (() => {
|
|
3
|
+
const storedTheme =
|
|
4
|
+
typeof localStorage !== 'undefined' && localStorage.getItem('starlight-theme');
|
|
5
|
+
const theme =
|
|
6
|
+
storedTheme ||
|
|
7
|
+
(window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark');
|
|
8
|
+
document.documentElement.dataset.theme = theme === 'light' ? 'light' : 'dark';
|
|
9
|
+
return {
|
|
10
|
+
updatePickers(theme = storedTheme || 'auto') {
|
|
11
|
+
document.querySelectorAll('starlight-theme-select').forEach((picker) => {
|
|
12
|
+
const select = picker.querySelector('select');
|
|
13
|
+
if (select) select.value = theme;
|
|
14
|
+
/** @type {HTMLTemplateElement | null} */
|
|
15
|
+
const tmpl = document.querySelector(`#theme-icons`);
|
|
16
|
+
const newIcon = tmpl && tmpl.content.querySelector('.' + theme);
|
|
17
|
+
if (newIcon) {
|
|
18
|
+
const oldIcon = picker.querySelector('svg.label-icon');
|
|
19
|
+
if (oldIcon) {
|
|
20
|
+
oldIcon.replaceChildren(...newIcon.cloneNode(true).childNodes);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
})();
|
|
27
|
+
</script><template id="theme-icons"><svg aria-hidden="true" class="light astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M5 12a1 1 0 0 0-1-1H3a1 1 0 0 0 0 2h1a1 1 0 0 0 1-1Zm.64 5-.71.71a1 1 0 0 0 0 1.41 1 1 0 0 0 1.41 0l.71-.71A1 1 0 0 0 5.64 17ZM12 5a1 1 0 0 0 1-1V3a1 1 0 0 0-2 0v1a1 1 0 0 0 1 1Zm5.66 2.34a1 1 0 0 0 .7-.29l.71-.71a1 1 0 1 0-1.41-1.41l-.66.71a1 1 0 0 0 0 1.41 1 1 0 0 0 .66.29Zm-12-.29a1 1 0 0 0 1.41 0 1 1 0 0 0 0-1.41l-.71-.71a1.004 1.004 0 1 0-1.43 1.41l.73.71ZM21 11h-1a1 1 0 0 0 0 2h1a1 1 0 0 0 0-2Zm-2.64 6A1 1 0 0 0 17 18.36l.71.71a1 1 0 0 0 1.41 0 1 1 0 0 0 0-1.41l-.76-.66ZM12 6.5a5.5 5.5 0 1 0 5.5 5.5A5.51 5.51 0 0 0 12 6.5Zm0 9a3.5 3.5 0 1 1 0-7 3.5 3.5 0 0 1 0 7Zm0 3.5a1 1 0 0 0-1 1v1a1 1 0 0 0 2 0v-1a1 1 0 0 0-1-1Z"/></svg><svg aria-hidden="true" class="dark astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21.64 13a1 1 0 0 0-1.05-.14 8.049 8.049 0 0 1-3.37.73 8.15 8.15 0 0 1-8.14-8.1 8.59 8.59 0 0 1 .25-2A1 1 0 0 0 8 2.36a10.14 10.14 0 1 0 14 11.69 1 1 0 0 0-.36-1.05Zm-9.5 6.69A8.14 8.14 0 0 1 7.08 5.22v.27a10.15 10.15 0 0 0 10.14 10.14 9.784 9.784 0 0 0 2.1-.22 8.11 8.11 0 0 1-7.18 4.32v-.04Z"/></svg><svg aria-hidden="true" class="auto astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z"/></svg></template><link rel="stylesheet" href="/_astro/print.DNXP8c50.css" media="print"><link rel="stylesheet" href="/_astro/common.xlUlWolS.css"><link rel="stylesheet" href="/_astro/Code.DfIJP77p.css"><script type="module" src="/_astro/page.B_tncCx8.js"></script></head> <body class="astro-hke2hksx"> <a href="#_top" class="astro-ln4bs55d">Skip to content</a> <div class="page sl-flex astro-4azfgxa5"> <header class="header astro-4azfgxa5"><div class="header astro-huokaw3t"> <div class="title-wrapper sl-flex astro-huokaw3t"> <a href="/" class="site-title sl-flex astro-pf7uwcts"> <img class="light:sl-hidden print:hidden astro-pf7uwcts" alt="Spec Engine" src="/_astro/spec-mark-white.DJBFLLUP.svg" width="512" height="512"> <img class="dark:sl-hidden print:block astro-pf7uwcts" alt="Spec Engine" src="/_astro/spec-mark-black.ZCN22lJi.svg" width="512" height="512"> <span class="astro-pf7uwcts" translate="no"> Spec Engine </span> </a> </div> <div class="sl-flex print:hidden astro-huokaw3t"> <site-search class="astro-huokaw3t astro-6oz6ysne" data-translations="{"placeholder":"Search"}"> <button data-open-modal disabled aria-label="Search" aria-keyshortcuts="Control+K" class="astro-6oz6ysne"> <svg aria-hidden="true" class="astro-6oz6ysne astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21.71 20.29 18 16.61A9 9 0 1 0 16.61 18l3.68 3.68a.999.999 0 0 0 1.42 0 1 1 0 0 0 0-1.39ZM11 18a7 7 0 1 1 0-14 7 7 0 0 1 0 14Z"/></svg> <span class="sl-hidden md:sl-block astro-6oz6ysne" aria-hidden="true">Search</span> <kbd class="sl-hidden md:sl-flex astro-6oz6ysne" style="display: none;"> <kbd class="astro-6oz6ysne">Ctrl</kbd><kbd class="astro-6oz6ysne">K</kbd> </kbd> </button> <dialog style="padding:0" aria-label="Search" class="astro-6oz6ysne"> <div class="dialog-frame sl-flex astro-6oz6ysne"> <button data-close-modal class="sl-flex md:sl-hidden astro-6oz6ysne"> Cancel </button> <div class="search-container astro-6oz6ysne"> <div id="starlight__search" class="astro-6oz6ysne"></div> </div> </div> </dialog> </site-search> <script>
|
|
28
|
+
(() => {
|
|
29
|
+
const openBtn = document.querySelector('button[data-open-modal]');
|
|
30
|
+
const shortcut = openBtn?.querySelector('kbd');
|
|
31
|
+
if (!openBtn || !(shortcut instanceof HTMLElement)) return;
|
|
32
|
+
const platformKey = shortcut.querySelector('kbd');
|
|
33
|
+
if (platformKey && /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)) {
|
|
34
|
+
platformKey.textContent = '⌘';
|
|
35
|
+
openBtn.setAttribute('aria-keyshortcuts', 'Meta+K');
|
|
36
|
+
}
|
|
37
|
+
shortcut.style.display = '';
|
|
38
|
+
})();
|
|
39
|
+
</script> <script type="module" src="/_astro/Search.astro_astro_type_script_index_0_lang.lq3t8uE2.js"></script> </div> <div class="sl-hidden md:sl-flex print:hidden right-group astro-huokaw3t"> <div class="sl-flex social-icons astro-huokaw3t"> <a href="https://github.com/spec-engine/spec-engine" rel="me" class="sl-flex astro-7c53pyad"><span class="sr-only astro-7c53pyad">GitHub</span><svg aria-hidden="true" class="astro-7c53pyad astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M12 .3a12 12 0 0 0-3.8 23.38c.6.12.83-.26.83-.57L9 21.07c-3.34.72-4.04-1.61-4.04-1.61-.55-1.39-1.34-1.76-1.34-1.76-1.08-.74.09-.73.09-.73 1.2.09 1.83 1.24 1.83 1.24 1.08 1.83 2.81 1.3 3.5 1 .1-.78.42-1.31.76-1.61-2.67-.3-5.47-1.33-5.47-5.93 0-1.31.47-2.38 1.24-3.22-.14-.3-.54-1.52.1-3.18 0 0 1-.32 3.3 1.23a11.5 11.5 0 0 1 6 0c2.28-1.55 3.29-1.23 3.29-1.23.64 1.66.24 2.88.12 3.18a4.65 4.65 0 0 1 1.23 3.22c0 4.61-2.8 5.63-5.48 5.92.42.36.81 1.1.81 2.22l-.01 3.29c0 .31.2.69.82.57A12 12 0 0 0 12 .3Z"/></svg></a> </div> <starlight-theme-select> <label style="--sl-select-width: 6.25em" class="astro-xrbm3f6n"> <span class="sr-only astro-xrbm3f6n">Select theme</span> <svg aria-hidden="true" class="icon label-icon astro-xrbm3f6n astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z"/></svg> <select autocomplete="off" class="astro-xrbm3f6n"> <option value="dark" class="astro-xrbm3f6n">Dark</option><option value="light" class="astro-xrbm3f6n">Light</option><option value="auto" selected class="astro-xrbm3f6n">Auto</option> </select> <svg aria-hidden="true" class="icon caret astro-xrbm3f6n astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M17 9.17a1 1 0 0 0-1.41 0L12 12.71 8.46 9.17a1 1 0 1 0-1.41 1.42l4.24 4.24a1.002 1.002 0 0 0 1.42 0L17 10.59a1.002 1.002 0 0 0 0-1.42Z"/></svg> </label> </starlight-theme-select> <script>
|
|
40
|
+
StarlightThemeProvider.updatePickers();
|
|
41
|
+
</script> <script type="module">const r="starlight-theme",o=e=>e==="auto"||e==="dark"||e==="light"?e:"auto",c=()=>o(typeof localStorage<"u"&&localStorage.getItem(r));function n(e){typeof localStorage<"u"&&localStorage.setItem(r,e==="light"||e==="dark"?e:"")}const l=()=>matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";function t(e){StarlightThemeProvider.updatePickers(e),document.documentElement.dataset.theme=e==="auto"?l():e,n(e)}matchMedia("(prefers-color-scheme: light)").addEventListener("change",()=>{c()==="auto"&&t("auto")});class s extends HTMLElement{constructor(){super(),t(c()),this.querySelector("select")?.addEventListener("change",a=>{a.currentTarget instanceof HTMLSelectElement&&t(o(a.currentTarget.value))})}}customElements.define("starlight-theme-select",s);</script> <script type="module">class s extends HTMLElement{constructor(){super();const e=this.querySelector("select");e&&(e.addEventListener("change",t=>{t.currentTarget instanceof HTMLSelectElement&&(window.location.pathname=t.currentTarget.value)}),window.addEventListener("pageshow",t=>{if(!t.persisted)return;const n=e.querySelector("option[selected]")?.index;n!==e.selectedIndex&&(e.selectedIndex=n??0)}))}}customElements.define("starlight-lang-select",s);</script> </div> </div></header> <nav class="sidebar print:hidden astro-4azfgxa5" aria-label="Main"> <starlight-menu-button class="print:hidden astro-5hpi47kq"> <button aria-expanded="false" aria-label="Menu" aria-controls="starlight__sidebar" class="sl-flex md:sl-hidden astro-5hpi47kq"> <svg aria-hidden="true" class="open-menu astro-5hpi47kq astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M3 8h18a1 1 0 1 0 0-2H3a1 1 0 0 0 0 2Zm18 8H3a1 1 0 0 0 0 2h18a1 1 0 0 0 0-2Zm0-5H3a1 1 0 0 0 0 2h18a1 1 0 0 0 0-2Z"/></svg> <svg aria-hidden="true" class="close-menu astro-5hpi47kq astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="m13.41 12 6.3-6.29a1.004 1.004 0 1 0-1.42-1.42L12 10.59l-6.29-6.3a1.004 1.004 0 0 0-1.42 1.42l6.3 6.29-6.3 6.29a1 1 0 0 0 0 1.42.998.998 0 0 0 1.42 0l6.29-6.3 6.29 6.3a.999.999 0 0 0 1.42 0 1 1 0 0 0 0-1.42L13.41 12Z"/></svg> </button> </starlight-menu-button> <script type="module">class s extends HTMLElement{constructor(){super(),this.btn=this.querySelector("button"),this.btn.addEventListener("click",()=>this.toggleExpanded());const t=this.closest("nav");t&&t.addEventListener("keyup",e=>this.closeOnEscape(e))}setExpanded(t){this.setAttribute("aria-expanded",String(t)),document.body.toggleAttribute("data-mobile-menu-expanded",t)}toggleExpanded(){this.setExpanded(this.getAttribute("aria-expanded")!=="true")}closeOnEscape(t){t.code==="Escape"&&(this.setExpanded(!1),this.btn.focus())}}customElements.define("starlight-menu-button",s);</script> <div id="starlight__sidebar" class="sidebar-pane astro-4azfgxa5"> <div class="sidebar-content sl-flex astro-4azfgxa5"> <sl-sidebar-state-persist data-hash="0fmmri7" class="astro-buzsinug"> <script aria-hidden="true">
|
|
42
|
+
(() => {
|
|
43
|
+
try {
|
|
44
|
+
if (!matchMedia('(min-width: 50em)').matches) return;
|
|
45
|
+
/** @type {HTMLElement | null} */
|
|
46
|
+
const target = document.querySelector('sl-sidebar-state-persist');
|
|
47
|
+
const state = JSON.parse(sessionStorage.getItem('sl-sidebar-state') || '0');
|
|
48
|
+
if (!target || !state || target.dataset.hash !== state.hash) return;
|
|
49
|
+
window._starlightScrollRestore = state.scroll;
|
|
50
|
+
customElements.define(
|
|
51
|
+
'sl-sidebar-restore',
|
|
52
|
+
class SidebarRestore extends HTMLElement {
|
|
53
|
+
connectedCallback() {
|
|
54
|
+
try {
|
|
55
|
+
const idx = parseInt(this.dataset.index || '');
|
|
56
|
+
const details = this.closest('details');
|
|
57
|
+
if (details && typeof state.open[idx] === 'boolean') details.open = state.open[idx];
|
|
58
|
+
} catch {}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
);
|
|
62
|
+
} catch {}
|
|
63
|
+
})();
|
|
64
|
+
</script> <ul class="top-level astro-ftvsh3ht"> <li class="astro-ftvsh3ht"> <a href="/overview/" aria-current="page" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Overview</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/getting-started/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Getting Started</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/architecture/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Architecture</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/commands/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Commands</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/format/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">SPEC.json Format</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/tags/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Tags</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/checks/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Integrity Checks</span> </a> </li><li class="astro-ftvsh3ht"> <details open class="astro-ftvsh3ht"> <summary class="astro-ftvsh3ht"> <span class="group-label astro-ftvsh3ht"> <span class="large astro-ftvsh3ht">Guides</span> </span> <svg aria-hidden="true" class="caret astro-ftvsh3ht astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <sl-sidebar-restore data-index="0"></sl-sidebar-restore> <ul class="astro-ftvsh3ht"> <li class="astro-ftvsh3ht"> <a href="/guides/adoption/" class="astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Adoption Guide</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/guides/platform-setup/" class="astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Platform Setup</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/guides/single-repo/" class="astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Single Repo (Rung 1)</span> </a> </li> </ul> </details> </li><li class="astro-ftvsh3ht"> <a href="/agent-reference/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Agent Reference</span> </a> </li> </ul> <script aria-hidden="true">
|
|
65
|
+
(() => {
|
|
66
|
+
const scroller = document.getElementById('starlight__sidebar');
|
|
67
|
+
if (!window._starlightScrollRestore || !scroller) return;
|
|
68
|
+
scroller.scrollTop = window._starlightScrollRestore;
|
|
69
|
+
delete window._starlightScrollRestore;
|
|
70
|
+
})();
|
|
71
|
+
</script> </sl-sidebar-state-persist> <div class="md:sl-hidden"> <div class="mobile-preferences sl-flex astro-q2jvmmon"> <div class="social-icons astro-q2jvmmon"> <a href="https://github.com/spec-engine/spec-engine" rel="me" class="sl-flex astro-7c53pyad"><span class="sr-only astro-7c53pyad">GitHub</span><svg aria-hidden="true" class="astro-7c53pyad astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M12 .3a12 12 0 0 0-3.8 23.38c.6.12.83-.26.83-.57L9 21.07c-3.34.72-4.04-1.61-4.04-1.61-.55-1.39-1.34-1.76-1.34-1.76-1.08-.74.09-.73.09-.73 1.2.09 1.83 1.24 1.83 1.24 1.08 1.83 2.81 1.3 3.5 1 .1-.78.42-1.31.76-1.61-2.67-.3-5.47-1.33-5.47-5.93 0-1.31.47-2.38 1.24-3.22-.14-.3-.54-1.52.1-3.18 0 0 1-.32 3.3 1.23a11.5 11.5 0 0 1 6 0c2.28-1.55 3.29-1.23 3.29-1.23.64 1.66.24 2.88.12 3.18a4.65 4.65 0 0 1 1.23 3.22c0 4.61-2.8 5.63-5.48 5.92.42.36.81 1.1.81 2.22l-.01 3.29c0 .31.2.69.82.57A12 12 0 0 0 12 .3Z"/></svg></a> </div> <starlight-theme-select> <label style="--sl-select-width: 6.25em" class="astro-xrbm3f6n"> <span class="sr-only astro-xrbm3f6n">Select theme</span> <svg aria-hidden="true" class="icon label-icon astro-xrbm3f6n astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z"/></svg> <select autocomplete="off" class="astro-xrbm3f6n"> <option value="dark" class="astro-xrbm3f6n">Dark</option><option value="light" class="astro-xrbm3f6n">Light</option><option value="auto" selected class="astro-xrbm3f6n">Auto</option> </select> <svg aria-hidden="true" class="icon caret astro-xrbm3f6n astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M17 9.17a1 1 0 0 0-1.41 0L12 12.71 8.46 9.17a1 1 0 1 0-1.41 1.42l4.24 4.24a1.002 1.002 0 0 0 1.42 0L17 10.59a1.002 1.002 0 0 0 0-1.42Z"/></svg> </label> </starlight-theme-select> <script>
|
|
72
|
+
StarlightThemeProvider.updatePickers();
|
|
73
|
+
</script> </div> </div> </div> </div> </nav> <div class="main-frame astro-4azfgxa5"> <script type="module">const a=document.getElementById("starlight__sidebar"),n=a?.querySelector("sl-sidebar-state-persist"),o="sl-sidebar-state",i=()=>{let t=[];const e=n?.dataset.hash||"";try{const s=sessionStorage.getItem(o),r=JSON.parse(s||"{}");Array.isArray(r.open)&&r.hash===e&&(t=r.open)}catch{}return{hash:e,open:t,scroll:a?.scrollTop||0}},c=t=>{try{sessionStorage.setItem(o,JSON.stringify(t))}catch{}},d=()=>c(i()),l=(t,e)=>{const s=i();s.open[e]=t,c(s)};n?.addEventListener("click",t=>{if(!(t.target instanceof Element))return;const e=t.target.closest("summary")?.closest("details");if(!e)return;const s=e.querySelector("sl-sidebar-restore"),r=parseInt(s?.dataset.index||"");isNaN(r)||l(!e.open,r)});addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&d()});addEventListener("pageHide",d);</script> <div class="lg:sl-flex astro-7dbgj2gg"> <aside class="right-sidebar-container print:hidden astro-7dbgj2gg"> <div class="right-sidebar astro-7dbgj2gg"> <div class="lg:sl-hidden astro-ungkjbep"><mobile-starlight-toc data-min-h="2" data-max-h="3" class="astro-qoe4sryv"><nav aria-labelledby="starlight__on-this-page--mobile" class="astro-qoe4sryv"><details id="starlight__mobile-toc" class="astro-qoe4sryv"><summary id="starlight__on-this-page--mobile" class="sl-flex astro-qoe4sryv"><span class="toggle sl-flex astro-qoe4sryv">On this page<svg aria-hidden="true" class="caret astro-qoe4sryv astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg></span><span class="display-current astro-qoe4sryv"></span></summary><div class="dropdown astro-qoe4sryv"><ul class="isMobile astro-mc3l7tuo" style="--depth: 0;"> <li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#_top" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Overview</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#why-it-exists" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Why it exists</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#provenance--the-external-join" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Provenance — the external join</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#deployment-tiers" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Deployment tiers</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#the-four-moves" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">The four moves</span> </a> </li> </ul></div></details></nav></mobile-starlight-toc><script type="module" src="/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.hwBsy0Mo.js"></script></div><div class="right-sidebar-panel sl-hidden lg:sl-block astro-ungkjbep"><div class="sl-container astro-ungkjbep"><starlight-toc data-min-h="2" data-max-h="3"><nav aria-labelledby="starlight__on-this-page"><h2 id="starlight__on-this-page">On this page</h2><ul class="astro-mc3l7tuo" style="--depth: 0;"> <li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#_top" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Overview</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#why-it-exists" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Why it exists</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#provenance--the-external-join" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Provenance — the external join</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#deployment-tiers" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Deployment tiers</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#the-four-moves" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">The four moves</span> </a> </li> </ul></nav></starlight-toc><script type="module" src="/_astro/TableOfContents.astro_astro_type_script_index_0_lang.FuRcXuRY.js"></script></div></div> </div> </aside> <div class="main-pane astro-7dbgj2gg"> <main data-pagefind-body class="astro-hke2hksx" lang="en" dir="ltr"> <div class="content-panel astro-cwqdebiv"> <div class="sl-container astro-cwqdebiv"> <h1 id="_top" class="astro-jkmikw3m">Overview</h1> </div> </div> <div class="content-panel astro-cwqdebiv"> <div class="sl-container astro-cwqdebiv"> <div class="sl-markdown-content"> <starlight-tabs class="astro-kxdxunri"> <div class="tablist-wrapper not-content astro-kxdxunri"> <ul role="tablist" class="astro-kxdxunri"> <li role="presentation" class="tab astro-kxdxunri"> <a role="tab" href="#tab-panel-0" id="tab-0" aria-selected="true" tabindex="0" class="astro-kxdxunri"> 👤 Human </a> </li><li role="presentation" class="tab astro-kxdxunri"> <a role="tab" href="#tab-panel-1" id="tab-1" aria-selected="false" tabindex="-1" class="astro-kxdxunri"> 🤖 Agent </a> </li> </ul> </div> <div id="tab-panel-0" aria-labelledby="tab-0" role="tabpanel"> <p><strong>Start here.</strong> Read <a href="/getting-started/">Getting Started</a> for a walkthrough, then explore <a href="/architecture/">Architecture</a>, <a href="/commands/">Commands</a>, and the <a href="/guides/adoption/">Guides</a>.</p><p>These docs are written in narrative style with rationale, examples, and context.</p> </div><div id="tab-panel-1" aria-labelledby="tab-1" role="tabpanel" hidden> <p><strong>You’re told to “use Spec Engine.”</strong> Go straight to the <a href="/agent-reference/">Agent Reference</a> — it has the exact CLI contracts, exit codes, JSON shapes, and the route → tag → check loop in as few tokens as possible. That page is optimized for agents, not humans.</p> </div> </starlight-tabs> <script type="module">class r extends HTMLElement{static#e=new Map;#t;#n="starlight-synced-tabs__";constructor(){super();const t=this.querySelector('[role="tablist"]');if(this.tabs=[...t.querySelectorAll('[role="tab"]')],this.panels=[...this.querySelectorAll(':scope > [role="tabpanel"]')],this.#t=this.dataset.syncKey,this.#t){const i=r.#e.get(this.#t)??[];i.push(this),r.#e.set(this.#t,i)}this.tabs.forEach((i,c)=>{i.addEventListener("click",e=>{e.preventDefault();const n=t.querySelector('[aria-selected="true"]');e.currentTarget!==n&&this.switchTab(e.currentTarget,c)}),i.addEventListener("keydown",e=>{const n=this.tabs.indexOf(e.currentTarget),s=e.key==="ArrowLeft"?n-1:e.key==="ArrowRight"?n+1:e.key==="Home"?0:e.key==="End"?this.tabs.length-1:null;s!==null&&this.tabs[s]&&(e.preventDefault(),this.switchTab(this.tabs[s],s))})})}switchTab(t,i,c=!0){if(!t)return;const e=c?this.getBoundingClientRect().top:0;this.tabs.forEach(s=>{s.setAttribute("aria-selected","false"),s.setAttribute("tabindex","-1")}),this.panels.forEach(s=>{s.hidden=!0});const n=this.panels[i];n&&(n.hidden=!1),t.removeAttribute("tabindex"),t.setAttribute("aria-selected","true"),c&&(t.focus(),r.#r(this,t),window.scrollTo({top:window.scrollY+(this.getBoundingClientRect().top-e),behavior:"instant"}))}#i(t){!this.#t||typeof localStorage>"u"||localStorage.setItem(this.#n+this.#t,t)}static#r(t,i){const c=t.#t,e=r.#s(i);if(!c||!e)return;const n=r.#e.get(c);if(n){for(const s of n){if(s===t)continue;const a=s.tabs.findIndex(o=>r.#s(o)===e);a!==-1&&s.switchTab(s.tabs[a],a,!1)}t.#i(e)}}static#s(t){return t.textContent?.trim()}}customElements.define("starlight-tabs",r);</script>
|
|
74
|
+
<p>Spec Engine is a cross-repo requirements engine. It manages durable domain requirements that survive past production, addressed by permanent ID, bound to code, and checkable in CI.</p>
|
|
75
|
+
<p>A <strong>spec</strong> is the standing specification of one domain. Requirements carry permanent IDs (<code dir="auto">KEY-NNN</code>); code points back at them with a <code dir="auto">// @spec KEY-NNN</code> tag. From that one convention you get three things:</p>
|
|
76
|
+
<ol>
|
|
77
|
+
<li>An agent can be routed to exactly the requirements a task touches</li>
|
|
78
|
+
<li>Integrity can be checked mechanically</li>
|
|
79
|
+
<li>A requirement’s history survives every refactor because IDs are permanent and changes supersede rather than overwrite</li>
|
|
80
|
+
</ol>
|
|
81
|
+
<div class="sl-heading-wrapper level-h2"><h2 id="why-it-exists">Why it exists</h2><a class="sl-anchor-link" href="#why-it-exists"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “Why it exists”</span></a></div>
|
|
82
|
+
<p>Feature-generation tools (Spec Kit, Kiro, GSD/DFC) are keyed to the change you are about to make; their specs are per-feature and end at “implemented.” Spec Engine is keyed to the <strong>domain</strong>, which outlives every feature. Its first-class operation is <strong>life after production</strong>: superseding established truth, not generating new work.</p>
|
|
83
|
+
<p>When AI agents produce more code in an afternoon than a person can carefully read in a week, Spec Engine answers by making the mission-critical path defend itself: <code dir="auto">spec check</code> runs on every change and reports whether a load-bearing requirement was broken, orphaned, or left unverified.</p>
|
|
84
|
+
<div class="sl-heading-wrapper level-h2"><h2 id="provenance--the-external-join">Provenance — the external join</h2><a class="sl-anchor-link" href="#provenance--the-external-join"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “Provenance — the external join”</span></a></div>
|
|
85
|
+
<p>A requirement can also carry an optional <strong><code dir="auto">Issues:</code></strong> field linking it back to the tracker where the <em>why</em> lives, by role (<code dir="auto">created</code>, <code dir="auto">supersedes-via</code>, <code dir="auto">amends-via</code>). <code dir="auto">spec provenance</code> widens the coverage matrix into a provenance matrix: per requirement, the issue that birthed it, the issues that revised or retired it, and the tests backing it. The engine treats issue IDs as opaque strings and never makes a network call; an optional tracker adapter resolves them to titles and URLs. See <a href="/format/">SPEC.json Format</a> and <a href="/commands/">Commands</a>.</p>
|
|
86
|
+
<div class="sl-heading-wrapper level-h2"><h2 id="deployment-tiers">Deployment tiers</h2><a class="sl-anchor-link" href="#deployment-tiers"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “Deployment tiers”</span></a></div>
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
<table><thead><tr><th>Tier</th><th>Form</th><th>Scope</th><th>Price</th></tr></thead><tbody><tr><td>Local platform</td><td>CLI + SQLite + local webapp</td><td>repos on this machine</td><td>free</td></tr><tr><td>Cloud service</td><td>same, hosted</td><td>the org’s complete repo set, always-on, CI-wired</td><td>paid</td></tr><tr><td>On-prem / air-gapped</td><td>the service in their infra</td><td>same as cloud, self-run</td><td>enterprise</td></tr></tbody></table>
|
|
117
|
+
<p>Same CLI, same schema, same webapp the whole way up.</p>
|
|
118
|
+
<div class="sl-heading-wrapper level-h2"><h2 id="the-four-moves">The four moves</h2><a class="sl-anchor-link" href="#the-four-moves"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “The four moves”</span></a></div>
|
|
119
|
+
<ul>
|
|
120
|
+
<li><strong>Author</strong> — write a requirement before code. Agent drafts, human merges.</li>
|
|
121
|
+
<li><strong>Route</strong> — <code dir="auto">spec resolve</code> / <code dir="auto">spec query</code> to load the requirements a task touches.</li>
|
|
122
|
+
<li><strong>Tag</strong> — add <code dir="auto">@spec KEY-NNN</code> in code as you satisfy a requirement.</li>
|
|
123
|
+
<li><strong>Check</strong> — <code dir="auto">spec check --ci</code> as a gate.</li>
|
|
124
|
+
</ul> </div> <footer class="sl-flex astro-g7gasbrj"> <div class="meta sl-flex astro-g7gasbrj"> <a href="https://github.com/spec-engine/spec-engine/edit/main/packages/site/src/content/docs/overview.mdx" class="sl-flex print:hidden astro-tr6myc4c"><svg aria-hidden="true" class="astro-tr6myc4c astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.2em;"><path d="M22 7.24a1 1 0 0 0-.29-.71l-4.24-4.24a1 1 0 0 0-1.1-.22 1 1 0 0 0-.32.22l-2.83 2.83L2.29 16.05a1 1 0 0 0-.29.71V21a1 1 0 0 0 1 1h4.24a1 1 0 0 0 .76-.29l10.87-10.93L21.71 8c.1-.1.17-.2.22-.33a1 1 0 0 0 0-.24v-.14l.07-.05ZM6.83 20H4v-2.83l9.93-9.93 2.83 2.83L6.83 20ZM18.17 8.66l-2.83-2.83 1.42-1.41 2.82 2.82-1.41 1.42Z"/></svg>Edit page</a> </div> <div class="pagination-links print:hidden astro-iud5vnm7" dir="ltr"> <a href="/getting-started/" rel="next" class="astro-iud5vnm7"> <svg aria-hidden="true" class="astro-iud5vnm7 astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.5rem;"><path d="M17.92 11.62a1.001 1.001 0 0 0-.21-.33l-5-5a1.003 1.003 0 1 0-1.42 1.42l3.3 3.29H7a1 1 0 0 0 0 2h7.59l-3.3 3.29a1.002 1.002 0 0 0 .325 1.639 1 1 0 0 0 1.095-.219l5-5a1 1 0 0 0 .21-.33 1 1 0 0 0 0-.76Z"/></svg> <span class="astro-iud5vnm7"> Next <br class="astro-iud5vnm7"> <span class="link-title astro-iud5vnm7">Getting Started</span> </span> </a> </div> </footer> </div> </div> </main> </div> </div> </div> </div> </body></html>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|