@spec-engine/spec-engine 0.7.1 → 0.7.3

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.
Files changed (54) hide show
  1. package/dist/docs/404.html +4 -4
  2. package/dist/docs/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.BcSo_yiZ.js +1 -0
  3. package/dist/docs/_astro/Search.astro_astro_type_script_index_0_lang.Djc9ZKGJ.js +1 -0
  4. package/dist/docs/_astro/TableOfContents.astro_astro_type_script_index_0_lang.Csloo1VZ.js +1 -0
  5. package/dist/docs/_astro/common.BPl3nku0.css +3 -0
  6. package/dist/docs/_astro/components.BeLFs6cp.css +1 -0
  7. package/dist/docs/_astro/page.cNngjUgL.js +1 -0
  8. package/dist/docs/_astro/print.ehPL0gv-.css +1 -0
  9. package/dist/docs/_astro/starlight-toc.CTCQXEge.js +1 -0
  10. package/dist/docs/_astro/ui-core.B94qsovR.js +2 -0
  11. package/dist/docs/agent-reference/index.html +23 -22
  12. package/dist/docs/architecture/index.html +422 -421
  13. package/dist/docs/checks/index.html +247 -246
  14. package/dist/docs/commands/index.html +125 -124
  15. package/dist/docs/format/index.html +92 -91
  16. package/dist/docs/getting-started/index.html +21 -20
  17. package/dist/docs/guides/adoption/index.html +13 -12
  18. package/dist/docs/guides/platform-setup/index.html +15 -14
  19. package/dist/docs/guides/single-repo/index.html +12 -11
  20. package/dist/docs/index.html +2 -152
  21. package/dist/docs/overview/index.html +8 -8
  22. package/dist/docs/pagefind/fragment/en_70e8a6f.pf_fragment +0 -0
  23. package/dist/docs/pagefind/fragment/en_907a67d.pf_fragment +0 -0
  24. package/dist/docs/pagefind/fragment/en_b81dc52.pf_fragment +0 -0
  25. package/dist/docs/pagefind/fragment/en_c8cc99c.pf_fragment +0 -0
  26. package/dist/docs/pagefind/fragment/en_de9d958.pf_fragment +0 -0
  27. package/dist/docs/pagefind/fragment/en_e616a50.pf_fragment +0 -0
  28. package/dist/docs/pagefind/fragment/en_f77a622.pf_fragment +0 -0
  29. package/dist/docs/pagefind/index/en_19cbfc6.pf_index +0 -0
  30. package/dist/docs/pagefind/index/en_4be71c4.pf_index +0 -0
  31. package/dist/docs/pagefind/pagefind-entry.json +1 -1
  32. package/dist/docs/pagefind/pagefind.en_f697eb692e.pf_meta +0 -0
  33. package/dist/docs/platform-mapping/index.html +162 -161
  34. package/dist/docs/tags/index.html +74 -73
  35. package/dist/impl.js +4 -4
  36. package/package.json +4 -4
  37. package/dist/docs/_astro/Code.CAimF0uL.css +0 -1
  38. package/dist/docs/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.hwBsy0Mo.js +0 -1
  39. package/dist/docs/_astro/Search.astro_astro_type_script_index_0_lang.lq3t8uE2.js +0 -1
  40. package/dist/docs/_astro/TableOfContents.astro_astro_type_script_index_0_lang.FuRcXuRY.js +0 -1
  41. package/dist/docs/_astro/common.DslAiFsT.css +0 -1
  42. package/dist/docs/_astro/page.B_tncCx8.js +0 -1
  43. package/dist/docs/_astro/print.DNXP8c50.css +0 -1
  44. package/dist/docs/_astro/ui-core.C8327L_n.js +0 -2
  45. package/dist/docs/pagefind/fragment/en_435dca1.pf_fragment +0 -0
  46. package/dist/docs/pagefind/fragment/en_4bdd17f.pf_fragment +0 -0
  47. package/dist/docs/pagefind/fragment/en_a3cd8bf.pf_fragment +0 -0
  48. package/dist/docs/pagefind/fragment/en_aaced0a.pf_fragment +0 -0
  49. package/dist/docs/pagefind/fragment/en_b44542a.pf_fragment +0 -0
  50. package/dist/docs/pagefind/fragment/en_d652b3c.pf_fragment +0 -0
  51. package/dist/docs/pagefind/fragment/en_eb51244.pf_fragment +0 -0
  52. package/dist/docs/pagefind/index/en_91ab2a1.pf_index +0 -0
  53. package/dist/docs/pagefind/index/en_b75c632.pf_index +0 -0
  54. package/dist/docs/pagefind/pagefind.en_dac6a68e28.pf_meta +0 -0
@@ -1,152 +1,2 @@
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">bun add -g @spec-engine/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 &amp; 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="/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 26px">Read the docs</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> <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 by <a href="https://dustinrea.com" class="hov-fg astro-j7pv25f6" style="color:var(--dim-d)">Dustin Rea</a></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>
1
+ <!DOCTYPE html><html lang="en" class="astro-lcdefpme"><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:#ffffff17;--line-d2:#ffffff29;--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:#c4f13526;--verified-line:#c4f13573;--drift:#e8a317;--broken:#f0472e;--unbound:#868d94;--grid-op:1;--f-disp:"Archivo";--f-sans:"IBM Plex Sans";--f-mono:"IBM Plex Mono"}:where(.astro-lcdefpme){box-sizing:border-box}html{-webkit-font-smoothing:antialiased;scroll-behavior:smooth}body{font-family:var(--f-sans), system-ui, sans-serif;color:var(--fg-d);background:var(--ink);margin:0}:where(.astro-lcdefpme)::selection{background:var(--acc);color:var(--acc-ink)}a:where(.astro-lcdefpme){color:inherit;text-decoration:none}.hov-fg:where(.astro-lcdefpme):hover{color:var(--fg-d)!important}.btn-acc:where(.astro-lcdefpme):hover{filter:brightness(.94)}.btn-ghost:where(.astro-lcdefpme):hover{border-color:var(--fg-d)!important}@media (width<=820px){:where(.astro-lcdefpme)[data-stack]{grid-template-columns:1fr!important;gap:28px!important}header:where(.astro-lcdefpme) nav:where(.astro-lcdefpme),:where(.astro-lcdefpme)[data-mobile-hide]{display:none!important}:where(.astro-lcdefpme)[data-mobile-bar]{display:flex!important}:where(.astro-lcdefpme)[data-matrix]{overflow-x:auto!important}:where(.astro-lcdefpme)[data-matrix]>div:where(.astro-lcdefpme){min-width:560px}}
2
+ </style><script type="module" src="/_astro/page.cNngjUgL.js"></script></head><body class="astro-lcdefpme"><div style="background:var(--ink);overflow-x:hidden" class="astro-lcdefpme"><!-- ============ 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-lcdefpme"><div style="max-width:1200px;margin:0 auto;display:flex;align-items:center;gap:28px;padding:15px 28px" class="astro-lcdefpme"><a href="#top" style="display:flex;align-items:center;gap:10px" class="astro-lcdefpme"><svg width="24" height="24" viewBox="0 0 64 64" fill="none" class="astro-lcdefpme"><path d="M25 13 H13 V51 H25" stroke="var(--fg-d)" stroke-width="6" class="astro-lcdefpme"></path><path d="M39 13 H51 V51 H39" stroke="var(--fg-d)" stroke-width="6" class="astro-lcdefpme"></path><rect x="26" y="26" width="12" height="12" fill="var(--acc)" class="astro-lcdefpme"></rect><line x1="32" y1="13" x2="32" y2="24" stroke="var(--fg-d)" stroke-width="4" class="astro-lcdefpme"></line><line x1="32" y1="40" x2="32" y2="51" stroke="var(--fg-d)" stroke-width="4" class="astro-lcdefpme"></line></svg><span style="font-family:var(--f-disp);font-weight:800;font-size:16px;letter-spacing:-0.01em" class="astro-lcdefpme">Spec Engine</span></a><nav style="display:flex;gap:26px;font-size:14px;color:var(--dim-d)" class="astro-lcdefpme"><a href="#how" class="hov-fg astro-lcdefpme" style="color:var(--dim-d)">How it works</a><a href="#product" class="hov-fg astro-lcdefpme" style="color:var(--dim-d)">Product</a><a href="#drift" class="hov-fg astro-lcdefpme" style="color:var(--dim-d)">Drift gate</a><a href="#features" class="hov-fg astro-lcdefpme" style="color:var(--dim-d)">Features</a></nav><span style="flex:1" class="astro-lcdefpme"></span><a href="/overview/" data-mobile-hide class="hov-fg astro-lcdefpme" 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-lcdefpme" 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-lcdefpme"><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-lcdefpme"></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-lcdefpme"><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-lcdefpme"></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-lcdefpme"><div class="astro-lcdefpme"><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-lcdefpme"><span style="width:7px;height:7px;background:var(--acc);display:inline-block" class="astro-lcdefpme"></span>DETERMINISTIC BY DESIGN</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-lcdefpme">Keep your<br class="astro-lcdefpme"><span style="white-space:nowrap" class="astro-lcdefpme">coding agents <span style="background:var(--acc);color:var(--acc-ink);padding:0 8px" class="astro-lcdefpme">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-lcdefpme">Write your requirements as durable specs with permanent IDs. Spec Engine binds them to the real code across every repo and catches drift in CI, before it ships.</p><div style="display:flex;gap:13px;margin-top:34px;flex-wrap:wrap" class="astro-lcdefpme"><a href="https://github.com/spec-engine/spec-engine" class="btn-acc astro-lcdefpme" 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-lcdefpme"><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-lcdefpme"></path></svg>Start free</a><a href="/overview/" class="btn-ghost astro-lcdefpme" 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-lcdefpme"><span style="display:flex;align-items:center;gap:7px" class="astro-lcdefpme"><span style="width:8px;height:8px;border-radius:2px;background:var(--verified)" class="astro-lcdefpme"></span>verified</span><span style="display:flex;align-items:center;gap:7px" class="astro-lcdefpme"><span style="width:8px;height:8px;border-radius:2px;background:var(--drift)" class="astro-lcdefpme"></span>drift</span><span style="display:flex;align-items:center;gap:7px" class="astro-lcdefpme"><span style="width:8px;height:8px;border-radius:2px;background:var(--broken)" class="astro-lcdefpme"></span>broken</span><span class="astro-lcdefpme">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-lcdefpme"><div style="display:flex;align-items:center;gap:8px;padding:12px 16px;border-bottom:1px solid var(--line-d);background:var(--charcoal)" class="astro-lcdefpme"><span style="width:9px;height:9px;border-radius:50%;background:#3A424A" class="astro-lcdefpme"></span><span style="width:9px;height:9px;border-radius:50%;background:#3A424A" class="astro-lcdefpme"></span><span style="width:9px;height:9px;border-radius:50%;background:#3A424A" class="astro-lcdefpme"></span><span style="font-family:var(--f-mono);font-size:11px;color:var(--mute-d);margin-left:8px" class="astro-lcdefpme">specs/billing.spec.md</span></div><div style="padding:20px;font-family:var(--f-mono);font-size:13px;line-height:1.9" class="astro-lcdefpme"><div class="astro-lcdefpme"><span style="color:var(--mute-d)" class="astro-lcdefpme">## </span><span style="color:var(--acc)" class="astro-lcdefpme">[SPEC-0042]</span><span style="color:var(--fg-d)" class="astro-lcdefpme">Refunds are idempotent</span></div><div style="color:var(--dim-d);padding-left:20px" class="astro-lcdefpme">Replaying a refund with the same key</div><div style="color:var(--dim-d);padding-left:20px" class="astro-lcdefpme">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-lcdefpme"><div style="display:flex;align-items:center;gap:10px;font-family:var(--f-mono);font-size:12px" class="astro-lcdefpme"><span style="color:var(--mute-d);width:52px" class="astro-lcdefpme">impl</span><span style="color:var(--dim-d);flex:1" class="astro-lcdefpme">worker/refunds/handler.ts:44</span><span style="color:var(--dim-d)" class="astro-lcdefpme">agent·Claude</span></div><div style="display:flex;align-items:center;gap:10px;font-family:var(--f-mono);font-size:12px" class="astro-lcdefpme"><span style="color:var(--mute-d);width:52px" class="astro-lcdefpme">test</span><span style="color:var(--dim-d);flex:1" class="astro-lcdefpme">worker/refunds/handler.test.ts</span><span style="color:var(--dim-d)" class="astro-lcdefpme">ci·unit</span></div><div style="display:flex;align-items:center;justify-content:space-between;margin-top:5px" class="astro-lcdefpme"><span style="font-family:var(--f-mono);font-size:11px;color:var(--mute-d)" class="astro-lcdefpme">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-lcdefpme"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" class="astro-lcdefpme"><path d="M5 12 L10 17 L19 6" stroke="var(--acc-ink)" stroke-width="2.4" class="astro-lcdefpme"></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-lcdefpme"><div style="max-width:1200px;margin:0 auto;display:flex;align-items:center;gap:24px;flex-wrap:wrap;padding:16px 28px" class="astro-lcdefpme"><span style="font-family:var(--f-mono);font-size:11px;letter-spacing:0.12em;color:var(--mute-d)" class="astro-lcdefpme">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-lcdefpme"><span style="color:var(--acc)" class="astro-lcdefpme">$</span><span id="quickstart-cmd" style="color:var(--fg-d)" class="astro-lcdefpme">bun add -g @spec-engine/spec-engine</span><span style="width:1px;height:16px;background:var(--line-d2)" class="astro-lcdefpme"></span><button id="quickstart-copy" aria-label="Copy install command" style="all:unset;display:flex;cursor:pointer" class="astro-lcdefpme"><svg width="15" height="15" viewBox="0 0 24 24" fill="none" class="astro-lcdefpme"><rect x="8" y="8" width="12" height="12" rx="2" stroke="var(--mute-d)" stroke-width="1.75" class="astro-lcdefpme"></rect><path d="M5 16 V6 A2 2 0 017 4 H15" stroke="var(--mute-d)" stroke-width="1.75" class="astro-lcdefpme"></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-lcdefpme"><div style="max-width:1200px;margin:0 auto;padding:92px 28px" class="astro-lcdefpme"><div style="font-family:var(--f-mono);font-size:12px;letter-spacing:0.16em;color:var(--mute-l);margin-bottom:26px" class="astro-lcdefpme">WHY IT HOLDS</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-lcdefpme">Spec Engine treats a requirement like a <span style="background:var(--acc);color:var(--acc-ink);padding:0 8px" class="astro-lcdefpme">machined part</span>: stamped with a permanent ID, bound to the code that implements it, and measured continuously for drift.</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-lcdefpme"><div style="background:var(--paper);padding:30px 26px" class="astro-lcdefpme"><div style="font-family:var(--f-mono);font-size:12px;color:#8A7400;letter-spacing:0.06em" class="astro-lcdefpme">DETERMINISTIC</div><p style="font-size:15px;line-height:1.6;color:var(--dim-l);margin:13px 0 0" class="astro-lcdefpme">A spec resolves to one answer: implemented, verified, drifted, or broken. No ambiguity, no vibes.</p></div><div style="background:var(--paper);padding:30px 26px" class="astro-lcdefpme"><div style="font-family:var(--f-mono);font-size:12px;color:#8A7400;letter-spacing:0.06em" class="astro-lcdefpme">MECHANICAL</div><p style="font-size:15px;line-height:1.6;color:var(--dim-l);margin:13px 0 0" class="astro-lcdefpme">Specs clamp to code like tooling to a workpiece. Move the code, the binding follows or flags.</p></div><div style="background:var(--paper);padding:30px 26px" class="astro-lcdefpme"><div style="font-family:var(--f-mono);font-size:12px;color:#8A7400;letter-spacing:0.06em" class="astro-lcdefpme">TRUSTWORTHY</div><p style="font-size:15px;line-height:1.6;color:var(--dim-l);margin:13px 0 0" class="astro-lcdefpme">CI is the referee. Drift is caught before it ships, not discovered in production a quarter later.</p></div></div></div></section><!-- ============ PRDs ============ --><section style="position:relative;overflow:hidden;border-bottom:1px solid var(--line-d)" class="astro-lcdefpme"><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-lcdefpme"></div><div style="position:relative;max-width:1200px;margin:0 auto;padding:90px 28px" class="astro-lcdefpme"><div style="font-family:var(--f-mono);font-size:12px;letter-spacing:0.16em;color:var(--acc);margin-bottom:12px" class="astro-lcdefpme">WORKS WITH YOUR PRDs</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-lcdefpme">PRDs are great. They just don't live past production.</h2><div data-stack style="display:grid;grid-template-columns:1fr 1fr;gap:44px;align-items:start;margin-bottom:46px" class="astro-lcdefpme"><p style="font-size:16px;line-height:1.65;color:var(--dim-d);margin:0" class="astro-lcdefpme">We're not replacing your PRD. But the day you ship, it stops keeping up. The fix QA found never made it back in. The quick customer request got deployed to the web app and forgotten on mobile. Six months on, the doc describes a product you no longer have.</p><p style="font-size:16px;line-height:1.65;color:var(--fg-d);margin:0" class="astro-lcdefpme">Specs in Spec Engine <span style="color:var(--acc);font-weight:600" class="astro-lcdefpme">live past production</span>. Every one is versioned, and it only changes by being <span style="font-weight:600" class="astro-lcdefpme">superseded</span> or <span style="font-weight:600" class="astro-lcdefpme">removed on purpose</span>, never by quietly falling out of sync.</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-lcdefpme"><div style="min-width:640px" class="astro-lcdefpme"><div style="display:grid;grid-template-columns:64px repeat(5,1fr);gap:7px;margin-bottom:10px" class="astro-lcdefpme"><span class="astro-lcdefpme"></span><span style="text-align:center;font-family:var(--f-mono);font-size:10px;letter-spacing:0.06em;color:var(--mute-d)" class="astro-lcdefpme">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-lcdefpme">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-lcdefpme">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-lcdefpme">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-lcdefpme">+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-lcdefpme"><span style="font-family:var(--f-mono);font-size:12px;color:var(--dim-d)" class="astro-lcdefpme">PRD</span><div style="height:36px;border-radius:5px;background:var(--elev);border:1px solid var(--line-d2)" class="astro-lcdefpme"></div><div style="height:36px;border-radius:5px;background:var(--elev);border:1px solid var(--line-d2)" class="astro-lcdefpme"></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-lcdefpme">QA fix not added</div><div style="height:36px;border-radius:5px;background:var(--elev);border:1px solid var(--line-d2)" class="astro-lcdefpme"></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-lcdefpme">OUT OF DATE</div></div><div style="display:grid;grid-template-columns:64px repeat(5,1fr);gap:7px;align-items:center" class="astro-lcdefpme"><span style="font-family:var(--f-mono);font-size:12px;color:var(--acc)" class="astro-lcdefpme">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-lcdefpme">v1</div><div style="height:36px;border-radius:5px;background:var(--acc-soft);border:1px solid var(--acc-line)" class="astro-lcdefpme"></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-lcdefpme">v2</div><div style="height:36px;border-radius:5px;background:var(--acc-soft);border:1px solid var(--acc-line)" class="astro-lcdefpme"></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-lcdefpme">v3 <svg width="11" height="11" viewBox="0 0 24 24" fill="none" class="astro-lcdefpme"><path d="M5 12 L10 17 L19 6" stroke="var(--verified)" stroke-width="2.6" class="astro-lcdefpme"></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-lcdefpme">the PRD captures intent at kickoff · the spec keeps it true, versioned, long after ship</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-lcdefpme"><div style="max-width:1200px;margin:0 auto;padding:88px 28px" class="astro-lcdefpme"><div style="font-family:var(--f-mono);font-size:12px;letter-spacing:0.16em;color:var(--mute-l);margin-bottom:12px" class="astro-lcdefpme">HOW IT WORKS</div><h2 style="font-family:var(--f-disp);font-weight:800;font-size:34px;letter-spacing:-0.025em;margin:0 0 44px" class="astro-lcdefpme">Four moving parts, one source of truth</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-lcdefpme"><div style="background:var(--paper);padding:28px 24px" class="astro-lcdefpme"><div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:18px" class="astro-lcdefpme"><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-lcdefpme"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" class="astro-lcdefpme"><rect x="4" y="4" width="16" height="16" rx="1" stroke="var(--fg-l)" stroke-width="1.75" class="astro-lcdefpme"></rect><path d="M8 10 H16 M8 14 H13" stroke="var(--fg-l)" stroke-width="1.75" class="astro-lcdefpme"></path></svg></span><span style="font-family:var(--f-mono);font-size:12px;color:var(--mute-l)" class="astro-lcdefpme">01</span></div><div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:8px" class="astro-lcdefpme">Write the spec</div><p style="font-size:14px;line-height:1.6;color:var(--dim-l);margin:0" class="astro-lcdefpme">Capture each requirement as a durable spec. Spec Engine stamps it with a permanent ID that never gets reused.</p></div><div style="background:var(--paper);padding:28px 24px" class="astro-lcdefpme"><div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:18px" class="astro-lcdefpme"><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-lcdefpme"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" class="astro-lcdefpme"><circle cx="7" cy="12" r="2.5" stroke="var(--fg-l)" stroke-width="1.75" class="astro-lcdefpme"></circle><circle cx="17" cy="7" r="2.5" stroke="var(--fg-l)" stroke-width="1.75" class="astro-lcdefpme"></circle><circle cx="17" cy="17" r="2.5" stroke="var(--fg-l)" stroke-width="1.75" class="astro-lcdefpme"></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-lcdefpme"></path></svg></span><span style="font-family:var(--f-mono);font-size:12px;color:var(--mute-l)" class="astro-lcdefpme">02</span></div><div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:8px" class="astro-lcdefpme">Bind it to code</div><p style="font-size:14px;line-height:1.6;color:var(--dim-l);margin:0" class="astro-lcdefpme">Tag the code and tests that satisfy it with <span style="font-family:var(--f-mono);color:#8A7400" class="astro-lcdefpme">@spec(ID)</span>. The binding follows refactors across repos.</p></div><div style="background:var(--paper);padding:28px 24px" class="astro-lcdefpme"><div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:18px" class="astro-lcdefpme"><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-lcdefpme"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" class="astro-lcdefpme"><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-lcdefpme"></path><path d="M8.5 12 L11 14.5 L15.5 9.5" stroke="var(--fg-l)" stroke-width="1.75" class="astro-lcdefpme"></path></svg></span><span style="font-family:var(--f-mono);font-size:12px;color:var(--mute-l)" class="astro-lcdefpme">03</span></div><div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:8px" class="astro-lcdefpme">Verify in CI</div><p style="font-size:14px;line-height:1.6;color:var(--dim-l);margin:0" class="astro-lcdefpme">Every run records who implemented each requirement and who verified it with tests, per repo.</p></div><div style="background:var(--paper);padding:28px 24px" class="astro-lcdefpme"><div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:18px" class="astro-lcdefpme"><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-lcdefpme"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" class="astro-lcdefpme"><path d="M12 3 L21 19 H3 Z" stroke="var(--broken)" stroke-width="1.75" class="astro-lcdefpme"></path><path d="M12 9 V13 M12 16 V16.4" stroke="var(--broken)" stroke-width="1.75" stroke-linecap="round" class="astro-lcdefpme"></path></svg></span><span style="font-family:var(--f-mono);font-size:12px;color:var(--mute-l)" class="astro-lcdefpme">04</span></div><div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:8px" class="astro-lcdefpme">Catch drift</div><p style="font-size:14px;line-height:1.6;color:var(--dim-l);margin:0" class="astro-lcdefpme">The moment an agent or human drops or contradicts a requirement, the gate blocks the merge.</p></div></div></div></section><!-- ============ PRODUCT GLIMPSE ============ --><section id="product" style="position:relative;overflow:hidden;border-bottom:1px solid var(--line-d)" class="astro-lcdefpme"><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-lcdefpme"></div><div style="position:relative;max-width:1200px;margin:0 auto;padding:90px 28px" class="astro-lcdefpme"><div style="font-family:var(--f-mono);font-size:12px;letter-spacing:0.16em;color:var(--acc);margin-bottom:12px" class="astro-lcdefpme">THE SOURCE OF TRUTH</div><h2 style="font-family:var(--f-disp);font-weight:800;font-size:34px;letter-spacing:-0.025em;margin:0 0 8px" class="astro-lcdefpme">See every requirement's real status</h2><p style="font-size:16px;line-height:1.6;color:var(--dim-d);max-width:600px;margin:0 0 40px" class="astro-lcdefpme">One coverage matrix across the whole platform: who implemented each requirement in source, who verified it with tests, and where it has drifted onto an outdated version.</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-lcdefpme"><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-lcdefpme"><div style="padding:12px 18px;font-family:var(--f-mono);font-size:10px;letter-spacing:0.1em;color:var(--mute-d)" class="astro-lcdefpme">REQUIREMENT</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-lcdefpme">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-lcdefpme">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-lcdefpme">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-lcdefpme">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-lcdefpme">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-lcdefpme">STATUS</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-lcdefpme"><div style="padding:13px 18px;display:flex;align-items:center;gap:11px;min-width:0" class="astro-lcdefpme"><span style="font-family:var(--f-mono);font-size:12px;color:var(--acc);flex:none" class="astro-lcdefpme">SPEC-0011</span><span style="font-size:13px;color:var(--fg-d);white-space:nowrap;overflow:hidden;text-overflow:ellipsis" class="astro-lcdefpme">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-lcdefpme"><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-lcdefpme">✓</span></div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-lcdefpme"><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-lcdefpme">✓</span></div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-lcdefpme"><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-lcdefpme">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-lcdefpme"><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-lcdefpme"></span></div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-lcdefpme"><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-lcdefpme">✓</span></div><div style="border-left:1px solid var(--line-d);display:flex;justify-content:flex-end;padding:0 12px" class="astro-lcdefpme"><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-lcdefpme">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-lcdefpme"><div style="padding:13px 18px;display:flex;align-items:center;gap:11px;min-width:0" class="astro-lcdefpme"><span style="font-family:var(--f-mono);font-size:12px;color:var(--acc);flex:none" class="astro-lcdefpme">SPEC-0042</span><span style="font-size:13px;color:var(--fg-d);white-space:nowrap;overflow:hidden;text-overflow:ellipsis" class="astro-lcdefpme">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-lcdefpme"><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-lcdefpme"></span></div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-lcdefpme"><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-lcdefpme">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-lcdefpme"><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-lcdefpme">✓</span></div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-lcdefpme"><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-lcdefpme"></span></div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-lcdefpme"><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-lcdefpme"></span></div><div style="border-left:1px solid var(--line-d);display:flex;justify-content:flex-end;padding:0 12px" class="astro-lcdefpme"><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-lcdefpme">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-lcdefpme"><div style="padding:13px 18px;display:flex;align-items:center;gap:11px;min-width:0" class="astro-lcdefpme"><span style="font-family:var(--f-mono);font-size:12px;color:var(--acc);flex:none" class="astro-lcdefpme">SPEC-0014</span><span style="font-size:13px;color:var(--fg-d);white-space:nowrap;overflow:hidden;text-overflow:ellipsis" class="astro-lcdefpme">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-lcdefpme"><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-lcdefpme">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-lcdefpme"><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-lcdefpme">✓</span></div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-lcdefpme"><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-lcdefpme"></span></div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-lcdefpme"><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-lcdefpme"></span></div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-lcdefpme"><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-lcdefpme"></span></div><div style="border-left:1px solid var(--line-d);display:flex;justify-content:flex-end;padding:0 12px" class="astro-lcdefpme"><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-lcdefpme">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-lcdefpme"><div style="padding:13px 18px;display:flex;align-items:center;gap:11px;min-width:0" class="astro-lcdefpme"><span style="font-family:var(--f-mono);font-size:12px;color:var(--acc);flex:none" class="astro-lcdefpme">SPEC-0002</span><span style="font-size:13px;color:var(--fg-d);white-space:nowrap;overflow:hidden;text-overflow:ellipsis" class="astro-lcdefpme">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-lcdefpme"><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-lcdefpme">✓</span></div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-lcdefpme"><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-lcdefpme">✓</span></div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-lcdefpme"><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-lcdefpme">✓</span></div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-lcdefpme"><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-lcdefpme">✓</span></div><div style="border-left:1px solid var(--line-d);display:flex;align-items:center;justify-content:center;padding:9px 0" class="astro-lcdefpme"><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-lcdefpme">S</span></div><div style="border-left:1px solid var(--line-d);display:flex;justify-content:flex-end;padding:0 12px" class="astro-lcdefpme"><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-lcdefpme">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-lcdefpme"><span style="display:flex;align-items:center;gap:7px" class="astro-lcdefpme"><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-lcdefpme">✓</span>verified</span><span style="display:flex;align-items:center;gap:7px" class="astro-lcdefpme"><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-lcdefpme">S</span>src only</span><span style="display:flex;align-items:center;gap:7px" class="astro-lcdefpme"><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-lcdefpme">T</span>test only</span><span style="display:flex;align-items:center;gap:7px" class="astro-lcdefpme"><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-lcdefpme"></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-lcdefpme"><div style="max-width:1200px;margin:0 auto;padding:90px 28px" class="astro-lcdefpme"><div style="font-family:var(--f-mono);font-size:12px;letter-spacing:0.16em;color:var(--mute-l);margin-bottom:12px" class="astro-lcdefpme">PLATFORM-WIDE CONSISTENCY</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-lcdefpme">One requirement. Every surface.</h2><div data-stack style="display:grid;grid-template-columns:1fr 1fr;gap:44px;align-items:start" class="astro-lcdefpme"><p style="font-size:16px;line-height:1.65;color:var(--dim-l);margin:0" class="astro-lcdefpme">Changes used to be filed per service: an issue for the API, one for the web app, one for mobile. Then you forget the internal admin and the support tools. Then the customer portal, and now it's broken.</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-lcdefpme">Not with <span style="background:var(--acc);color:var(--acc-ink);padding:0 8px" class="astro-lcdefpme">Spec Engine</span>.</p></div><div data-stack style="display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-top:44px" class="astro-lcdefpme"><!-- old way --><div style="border:1px solid var(--line-l);border-radius:11px;overflow:hidden;background:var(--paper)" class="astro-lcdefpme"><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-lcdefpme">THE OLD WAY · ONE TICKET PER SERVICE</div><div style="padding:8px 20px" class="astro-lcdefpme"><div style="display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px solid var(--line-l)" class="astro-lcdefpme"><span style="font-size:14px;color:var(--fg-l);flex:1" class="astro-lcdefpme">API</span><span style="font-family:var(--f-mono);font-size:11px;color:var(--dim-l)" class="astro-lcdefpme">ISSUE-2101</span><span style="font-family:var(--f-mono);font-size:10px;color:var(--mute-l);width:96px;text-align:right" class="astro-lcdefpme">filed</span></div><div style="display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px solid var(--line-l)" class="astro-lcdefpme"><span style="font-size:14px;color:var(--fg-l);flex:1" class="astro-lcdefpme">Web app</span><span style="font-family:var(--f-mono);font-size:11px;color:var(--dim-l)" class="astro-lcdefpme">ISSUE-2102</span><span style="font-family:var(--f-mono);font-size:10px;color:var(--mute-l);width:96px;text-align:right" class="astro-lcdefpme">filed</span></div><div style="display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px solid var(--line-l)" class="astro-lcdefpme"><span style="font-size:14px;color:var(--fg-l);flex:1" class="astro-lcdefpme">Mobile</span><span style="font-family:var(--f-mono);font-size:11px;color:var(--dim-l)" class="astro-lcdefpme">ISSUE-2103</span><span style="font-family:var(--f-mono);font-size:10px;color:var(--mute-l);width:96px;text-align:right" class="astro-lcdefpme">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-lcdefpme"><span style="font-size:14px;color:var(--fg-l);flex:1" class="astro-lcdefpme">Internal admin</span><span style="font-family:var(--f-mono);font-size:11px;color:var(--mute-l)" class="astro-lcdefpme">—</span><span style="font-family:var(--f-mono);font-size:10px;color:var(--mute-l);width:96px;text-align:right" class="astro-lcdefpme">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-lcdefpme"><span style="font-size:14px;color:var(--fg-l);flex:1" class="astro-lcdefpme">Support tools</span><span style="font-family:var(--f-mono);font-size:11px;color:var(--mute-l)" class="astro-lcdefpme">—</span><span style="font-family:var(--f-mono);font-size:10px;color:var(--mute-l);width:96px;text-align:right" class="astro-lcdefpme">forgotten</span></div><div style="display:flex;align-items:center;gap:12px;padding:11px 0" class="astro-lcdefpme"><span style="font-size:14px;color:var(--fg-l);flex:1" class="astro-lcdefpme">Customer portal</span><span style="font-family:var(--f-mono);font-size:11px;color:var(--broken)" class="astro-lcdefpme">—</span><span style="font-family:var(--f-mono);font-size:10px;font-weight:600;color:var(--broken);width:96px;text-align:right" class="astro-lcdefpme">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-lcdefpme"><div style="padding:14px 20px;border-bottom:1px solid var(--line-d);display:flex;align-items:center;gap:10px" class="astro-lcdefpme"><span style="font-family:var(--f-mono);font-size:13px;color:var(--acc)" class="astro-lcdefpme">[SPEC-0042]</span><span style="font-size:13px;color:var(--fg-d)" class="astro-lcdefpme">Refunds are idempotent</span></div><div style="padding:8px 20px" class="astro-lcdefpme"><div style="display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px solid var(--line-d)" class="astro-lcdefpme"><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-lcdefpme"><svg width="11" height="11" viewBox="0 0 24 24" fill="none" class="astro-lcdefpme"><path d="M5 12 L10 17 L19 6" stroke="var(--verified)" stroke-width="2.6" class="astro-lcdefpme"></path></svg></span><span style="font-size:14px;color:var(--fg-d);flex:1" class="astro-lcdefpme">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-lcdefpme">VERIFIED</span></div><div style="display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px solid var(--line-d)" class="astro-lcdefpme"><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-lcdefpme"><svg width="11" height="11" viewBox="0 0 24 24" fill="none" class="astro-lcdefpme"><path d="M5 12 L10 17 L19 6" stroke="var(--verified)" stroke-width="2.6" class="astro-lcdefpme"></path></svg></span><span style="font-size:14px;color:var(--fg-d);flex:1" class="astro-lcdefpme">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-lcdefpme">VERIFIED</span></div><div style="display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px solid var(--line-d)" class="astro-lcdefpme"><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-lcdefpme"><svg width="11" height="11" viewBox="0 0 24 24" fill="none" class="astro-lcdefpme"><path d="M5 12 L10 17 L19 6" stroke="var(--verified)" stroke-width="2.6" class="astro-lcdefpme"></path></svg></span><span style="font-size:14px;color:var(--fg-d);flex:1" class="astro-lcdefpme">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-lcdefpme">VERIFIED</span></div><div style="display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px solid var(--line-d)" class="astro-lcdefpme"><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-lcdefpme"><svg width="11" height="11" viewBox="0 0 24 24" fill="none" class="astro-lcdefpme"><path d="M5 12 L10 17 L19 6" stroke="var(--verified)" stroke-width="2.6" class="astro-lcdefpme"></path></svg></span><span style="font-size:14px;color:var(--fg-d);flex:1" class="astro-lcdefpme">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-lcdefpme">VERIFIED</span></div><div style="display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px solid var(--line-d)" class="astro-lcdefpme"><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-lcdefpme"><svg width="11" height="11" viewBox="0 0 24 24" fill="none" class="astro-lcdefpme"><path d="M5 12 L10 17 L19 6" stroke="var(--verified)" stroke-width="2.6" class="astro-lcdefpme"></path></svg></span><span style="font-size:14px;color:var(--fg-d);flex:1" class="astro-lcdefpme">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-lcdefpme">VERIFIED</span></div><div style="display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px solid var(--line-d)" class="astro-lcdefpme"><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-lcdefpme"><svg width="11" height="11" viewBox="0 0 24 24" fill="none" class="astro-lcdefpme"><path d="M5 12 L10 17 L19 6" stroke="var(--verified)" stroke-width="2.6" class="astro-lcdefpme"></path></svg></span><span style="font-size:14px;color:var(--fg-d);flex:1" class="astro-lcdefpme">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-lcdefpme">VERIFIED</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-lcdefpme">one spec · every surface bound and verified · nothing forgotten</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-lcdefpme"><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-lcdefpme"><div class="astro-lcdefpme"><div style="font-family:var(--f-mono);font-size:12px;letter-spacing:0.16em;color:var(--mute-l);margin-bottom:12px" class="astro-lcdefpme">DRIFT GATE</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-lcdefpme">Catch drift before it ships.</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-lcdefpme">Don't let your agent gaslight you into thinking you never wrote the requirement.</p><p style="font-size:16px;line-height:1.6;color:var(--dim-l);margin:0 0 18px;max-width:520px" class="astro-lcdefpme">A requirement that quietly disappears without being superseded is indistinguishable from an agent dropping it. Agents can't tell intent from accident, so the CI gate holds the merge, and the audit trail shows exactly who wrote it and when.</p><p style="font-size:16px;line-height:1.6;color:var(--dim-l);margin:0;max-width:520px" class="astro-lcdefpme">Supersession is what lets every agent on the platform tell <span style="color:var(--fg-l);font-weight:600" class="astro-lcdefpme">drift</span> apart from <span style="color:var(--fg-l);font-weight:600" class="astro-lcdefpme">intention</span>.</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-lcdefpme"><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-lcdefpme"><svg width="17" height="17" viewBox="0 0 24 24" fill="none" class="astro-lcdefpme"><path d="M12 3 L21 19 H3 Z" stroke="var(--broken)" stroke-width="1.75" class="astro-lcdefpme"></path><path d="M12 9 V13 M12 16 V16.3" stroke="var(--broken)" stroke-width="1.75" stroke-linecap="round" class="astro-lcdefpme"></path></svg><span style="font-family:var(--f-disp);font-weight:800;font-size:15px;color:var(--broken)" class="astro-lcdefpme">MERGE BLOCKED</span><span style="flex:1" class="astro-lcdefpme"></span><span style="font-family:var(--f-mono);font-size:11px;color:var(--mute-d)" class="astro-lcdefpme">PR #482</span></div><div style="padding:18px;font-family:var(--f-mono);font-size:12.5px;line-height:1.9" class="astro-lcdefpme"><div style="color:var(--mute-d)" class="astro-lcdefpme">specs/billing.spec.md</div><div style="color:var(--broken)" class="astro-lcdefpme">− ## [SPEC-0042] Refunds are idempotent</div><div style="color:var(--mute-d);margin-top:6px" class="astro-lcdefpme">worker/refunds/handler.ts</div><div style="color:var(--broken)" class="astro-lcdefpme">− // @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-lcdefpme">no <span style="color:var(--acc)" class="astro-lcdefpme">supersedes</span> record found · <span style="color:var(--broken)" class="astro-lcdefpme">silent drop</span></div></div></div></section><!-- ============ FEATURES ============ --><section id="features" style="background:var(--ink);border-bottom:1px solid var(--line-d)" class="astro-lcdefpme"><div style="max-width:1200px;margin:0 auto;padding:90px 28px" class="astro-lcdefpme"><div style="font-family:var(--f-mono);font-size:12px;letter-spacing:0.16em;color:var(--acc);margin-bottom:12px" class="astro-lcdefpme">WHAT YOU GET</div><h2 style="font-family:var(--f-disp);font-weight:800;font-size:34px;letter-spacing:-0.025em;margin:0 0 14px" class="astro-lcdefpme">The precision of a principal engineer</h2><p style="font-size:16px;line-height:1.6;color:var(--dim-d);max-width:560px;margin:0 0 44px" class="astro-lcdefpme">For people who know exactly what they want. You set the requirement; Spec Engine holds everyone to it, agent or human.</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-lcdefpme"><div style="background:var(--panel);padding:28px 26px" class="astro-lcdefpme"><div style="font-family:var(--f-mono);font-size:13px;color:var(--acc);margin-bottom:12px" class="astro-lcdefpme">[ ID ]</div><div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:8px" class="astro-lcdefpme">Permanent IDs</div><p style="font-size:14px;line-height:1.6;color:var(--dim-d);margin:0" class="astro-lcdefpme">Every requirement gets a stable identifier that survives renames, refactors, and rewrites.</p></div><div style="background:var(--panel);padding:28px 26px" class="astro-lcdefpme"><div style="font-family:var(--f-mono);font-size:13px;color:var(--acc);margin-bottom:12px" class="astro-lcdefpme">spec → code</div><div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:8px" class="astro-lcdefpme">Cross-repo bindings</div><p style="font-size:14px;line-height:1.6;color:var(--dim-d);margin:0" class="astro-lcdefpme">One requirement, bound to its implementation and tests across every repo in the platform.</p></div><div style="background:var(--panel);padding:28px 26px" class="astro-lcdefpme"><div style="font-family:var(--f-mono);font-size:13px;color:var(--acc);margin-bottom:12px" class="astro-lcdefpme">CI gate</div><div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:8px" class="astro-lcdefpme">Drift caught in CI</div><p style="font-size:14px;line-height:1.6;color:var(--dim-d);margin:0" class="astro-lcdefpme">Silent drops and contradictions block the merge before they reach production.</p></div><div style="background:var(--panel);padding:28px 26px" class="astro-lcdefpme"><div style="font-family:var(--f-mono);font-size:13px;color:var(--acc);margin-bottom:12px" class="astro-lcdefpme">4 states</div><div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:8px" class="astro-lcdefpme">One clear status</div><p style="font-size:14px;line-height:1.6;color:var(--dim-d);margin:0" class="astro-lcdefpme">Verified, drift, broken, or unbound. Deterministic, never a guess.</p></div><div style="background:var(--panel);padding:28px 26px" class="astro-lcdefpme"><div style="font-family:var(--f-mono);font-size:13px;color:var(--acc);margin-bottom:12px" class="astro-lcdefpme">v1 → v4</div><div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:8px" class="astro-lcdefpme">Versions &amp; audit trail</div><p style="font-size:14px;line-height:1.6;color:var(--dim-d);margin:0" class="astro-lcdefpme">Amendments mint versions and mark predecessors superseded. Full history, who and when.</p></div><div style="background:var(--panel);padding:28px 26px" class="astro-lcdefpme"><div style="font-family:var(--f-mono);font-size:13px;color:var(--acc);margin-bottom:12px" class="astro-lcdefpme">agents</div><div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:8px" class="astro-lcdefpme">Agent-coherent</div><p style="font-size:14px;line-height:1.6;color:var(--dim-d);margin:0" class="astro-lcdefpme">Agents building on the platform stay on-spec instead of wandering off it.</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-lcdefpme"><div style="max-width:1200px;margin:0 auto;padding:90px 28px" class="astro-lcdefpme"><div style="font-family:var(--f-mono);font-size:12px;letter-spacing:0.16em;color:var(--mute-l);margin-bottom:12px" class="astro-lcdefpme">WHO IT'S FOR</div><h2 style="font-family:var(--f-disp);font-weight:800;font-size:34px;letter-spacing:-0.025em;margin:0 0 8px" class="astro-lcdefpme">For anyone who owns an outcome</h2><p style="font-size:16px;line-height:1.6;color:var(--dim-l);max-width:600px;margin:0 0 44px" class="astro-lcdefpme">If you decide what the product must do, or you have to prove it does, Spec Engine keeps everyone honest to it.</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-lcdefpme"><div style="background:var(--paper);padding:28px 26px" class="astro-lcdefpme"><div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:9px" class="astro-lcdefpme">Developers</div><p style="font-size:14px;line-height:1.6;color:var(--dim-l);margin:0" class="astro-lcdefpme">Prove what you built satisfies the requirement, without writing a status update.</p></div><div style="background:var(--paper);padding:28px 26px" class="astro-lcdefpme"><div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:9px" class="astro-lcdefpme">Vibe coders</div><p style="font-size:14px;line-height:1.6;color:var(--dim-l);margin:0" class="astro-lcdefpme">Ship fast with an agent and still know the moment something quietly broke.</p></div><div style="background:var(--paper);padding:28px 26px" class="astro-lcdefpme"><div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:9px" class="astro-lcdefpme">Agencies</div><p style="font-size:14px;line-height:1.6;color:var(--dim-l);margin:0" class="astro-lcdefpme">Hand off a codebase where every client requirement is traceable to the code that meets it.</p></div><div style="background:var(--paper);padding:28px 26px" class="astro-lcdefpme"><div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:9px" class="astro-lcdefpme">Product managers</div><p style="font-size:14px;line-height:1.6;color:var(--dim-l);margin:0" class="astro-lcdefpme">Watch requirements stay true across every surface, long after the PRD goes stale.</p></div><div style="background:var(--paper);padding:28px 26px" class="astro-lcdefpme"><div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:9px" class="astro-lcdefpme">Business analysts</div><p style="font-size:14px;line-height:1.6;color:var(--dim-l);margin:0" class="astro-lcdefpme">Write a requirement once and see exactly where it lives in the product.</p></div><div style="background:var(--paper);padding:28px 26px" class="astro-lcdefpme"><div style="font-family:var(--f-disp);font-weight:700;font-size:17px;margin-bottom:9px" class="astro-lcdefpme">QA</div><p style="font-size:14px;line-height:1.6;color:var(--dim-l);margin:0" class="astro-lcdefpme">Know which requirements are verified by tests, and which only claim to be.</p></div></div></div></section><!-- ============ CTA ============ --><section id="cta" style="position:relative;overflow:hidden;border-bottom:1px solid var(--line-d)" class="astro-lcdefpme"><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-lcdefpme"></div><div style="position:relative;max-width:900px;margin:0 auto;text-align:center;padding:100px 28px" class="astro-lcdefpme"><svg width="52" height="52" viewBox="0 0 64 64" fill="none" style="margin-bottom:26px" class="astro-lcdefpme"><path d="M25 13 H13 V51 H25" stroke="var(--fg-d)" stroke-width="5.5" class="astro-lcdefpme"></path><path d="M39 13 H51 V51 H39" stroke="var(--fg-d)" stroke-width="5.5" class="astro-lcdefpme"></path><rect x="26" y="26" width="12" height="12" fill="var(--acc)" class="astro-lcdefpme"></rect><line x1="32" y1="13" x2="32" y2="24" stroke="var(--fg-d)" stroke-width="4" class="astro-lcdefpme"></line><line x1="32" y1="40" x2="32" y2="51" stroke="var(--fg-d)" stroke-width="4" class="astro-lcdefpme"></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-lcdefpme">The spec is the source of truth.</h2><p style="font-size:18px;line-height:1.6;color:var(--dim-d);max-width:520px;margin:22px auto 0" class="astro-lcdefpme">Requirements that outlive features. Drift caught before it ships. Agents that stay honest.</p><div style="display:flex;gap:13px;justify-content:center;margin-top:34px;flex-wrap:wrap" class="astro-lcdefpme"><a href="https://github.com/spec-engine/spec-engine" class="btn-acc astro-lcdefpme" 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-lcdefpme"><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-lcdefpme"></path></svg>Start free</a><a href="/overview/" class="btn-ghost astro-lcdefpme" 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">Read the docs</a></div></div></section><!-- ============ FOOTER ============ --><footer style="background:var(--ink);padding:40px 28px" class="astro-lcdefpme"><div style="max-width:1200px;margin:0 auto;display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:16px" class="astro-lcdefpme"><div style="display:flex;align-items:center;gap:10px" class="astro-lcdefpme"><svg width="20" height="20" viewBox="0 0 64 64" fill="none" class="astro-lcdefpme"><path d="M25 13 H13 V51 H25" stroke="var(--fg-d)" stroke-width="6" class="astro-lcdefpme"></path><path d="M39 13 H51 V51 H39" stroke="var(--fg-d)" stroke-width="6" class="astro-lcdefpme"></path><rect x="26" y="26" width="12" height="12" fill="var(--acc)" class="astro-lcdefpme"></rect><line x1="32" y1="13" x2="32" y2="24" stroke="var(--fg-d)" stroke-width="4" class="astro-lcdefpme"></line><line x1="32" y1="40" x2="32" y2="51" stroke="var(--fg-d)" stroke-width="4" class="astro-lcdefpme"></line></svg><span style="font-family:var(--f-disp);font-weight:800;font-size:14px;color:var(--fg-d)" class="astro-lcdefpme">Spec Engine</span></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-lcdefpme"><span style="display:flex;align-items:center;gap:6px" class="astro-lcdefpme">Made with <svg width="12" height="12" viewBox="0 0 24 24" fill="var(--acc)" style="flex:none" class="astro-lcdefpme"><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-lcdefpme"></path></svg> from the heart of Indiana by <a href="https://dustinrea.com" class="hov-fg astro-lcdefpme" style="color:var(--dim-d)">Dustin Rea</a></span><span style="width:1px;height:12px;background:var(--line-d2)" class="astro-lcdefpme"></span>© 2026 · SPEC-0000</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-lcdefpme"><a href="https://github.com/spec-engine/spec-engine" class="btn-acc astro-lcdefpme" 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-lcdefpme"><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-lcdefpme"></path></svg>Start free with GitHub</a></div></div><script type="module">document.getElementById(`quickstart-copy`)?.addEventListener(`click`,()=>{let e=document.getElementById(`quickstart-cmd`)?.textContent??``;navigator.clipboard?.writeText(e.trim())});</script></body></html>