@spec-engine/spec-engine 0.8.1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/agent/AGENTS.md +678 -0
- package/dist/agent/mcp.json +11 -0
- package/dist/agent/pre-commit +3 -0
- package/dist/agent/skills/req-author/SKILL.md +102 -0
- package/dist/docs/agent-reference/index.html +1280 -33
- package/dist/docs/architecture/index.html +6 -6
- package/dist/docs/checks/index.html +19 -266
- package/dist/docs/commands/index.html +32 -164
- package/dist/docs/format/index.html +2 -9
- package/dist/docs/getting-started/index.html +3 -3
- package/dist/docs/guides/platform-setup/index.html +2 -2
- package/dist/docs/pagefind/fragment/en_10e3da6.pf_fragment +0 -0
- package/dist/docs/pagefind/fragment/en_37cae5e.pf_fragment +0 -0
- package/dist/docs/pagefind/fragment/en_7fc2fcd.pf_fragment +0 -0
- package/dist/docs/pagefind/fragment/en_96d3bc1.pf_fragment +0 -0
- package/dist/docs/pagefind/fragment/en_a26aa07.pf_fragment +0 -0
- package/dist/docs/pagefind/fragment/en_b7e68ef.pf_fragment +0 -0
- package/dist/docs/pagefind/fragment/en_d8a5bcd.pf_fragment +0 -0
- package/dist/docs/pagefind/fragment/en_de67937.pf_fragment +0 -0
- package/dist/docs/pagefind/fragment/en_fc3c55b.pf_fragment +0 -0
- package/dist/docs/pagefind/index/en_1664b45.pf_index +0 -0
- package/dist/docs/pagefind/index/en_a8b8bb6.pf_index +0 -0
- package/dist/docs/pagefind/pagefind-entry.json +1 -1
- package/dist/docs/pagefind/pagefind.en_bc3d4a7766.pf_meta +0 -0
- package/dist/docs/platform-mapping/index.html +2 -1
- package/dist/docs/tags/index.html +9 -92
- package/dist/impl.js +1948 -653
- package/package.json +1 -1
- package/dist/docs/pagefind/fragment/en_1f98c2d.pf_fragment +0 -0
- package/dist/docs/pagefind/fragment/en_24f76b6.pf_fragment +0 -0
- package/dist/docs/pagefind/fragment/en_2ee687a.pf_fragment +0 -0
- package/dist/docs/pagefind/fragment/en_4bd9de6.pf_fragment +0 -0
- package/dist/docs/pagefind/fragment/en_9cc1878.pf_fragment +0 -0
- package/dist/docs/pagefind/fragment/en_9cfc306.pf_fragment +0 -0
- package/dist/docs/pagefind/fragment/en_b81dc52.pf_fragment +0 -0
- package/dist/docs/pagefind/fragment/en_c3abf3d.pf_fragment +0 -0
- package/dist/docs/pagefind/fragment/en_c3e92c6.pf_fragment +0 -0
- package/dist/docs/pagefind/index/en_59c3abf.pf_index +0 -0
- package/dist/docs/pagefind/index/en_a630d23.pf_index +0 -0
- package/dist/docs/pagefind/pagefind.en_ced49c317e.pf_meta +0 -0
|
@@ -251,7 +251,7 @@
|
|
|
251
251
|
</tr>
|
|
252
252
|
<tr>
|
|
253
253
|
<td><code dir="auto">mint</code></td>
|
|
254
|
-
<td>platform dir, key, statement, why,
|
|
254
|
+
<td>platform dir, key, statement, why, relates, issue, status</td>
|
|
255
255
|
<td>the new id and file, or <code dir="auto">not_found</code> / <code dir="auto">usage</code> / <code dir="auto">invalid_domain_file</code></td>
|
|
256
256
|
<td><code dir="auto">spec req --text</code></td>
|
|
257
257
|
<td><code dir="auto">POST /api/requirements</code></td>
|
|
@@ -268,7 +268,7 @@
|
|
|
268
268
|
<tr>
|
|
269
269
|
<td><code dir="auto">supersede</code></td>
|
|
270
270
|
<td>platform dir, id, successor statement and fields, a fresh-tags callback</td>
|
|
271
|
-
<td>the successor id, the domain version, the
|
|
271
|
+
<td>the successor id, the domain version, the retagged sites, or <code dir="auto">not_found</code> / <code dir="auto">conflict</code> / <code dir="auto">usage</code> / <code dir="auto">invalid_domain_file</code></td>
|
|
272
272
|
<td><code dir="auto">spec supersede</code></td>
|
|
273
273
|
<td><code dir="auto">POST /api/requirements/:id/supersede</code></td>
|
|
274
274
|
<td><code dir="auto">spec_supersede</code></td>
|
|
@@ -276,7 +276,7 @@
|
|
|
276
276
|
<tr>
|
|
277
277
|
<td><code dir="auto">move</code></td>
|
|
278
278
|
<td>platform dir, id, target domain key, optional successor fields, a fresh-tags callback</td>
|
|
279
|
-
<td>both files, both versions, the
|
|
279
|
+
<td>both files, both versions, the retagged sites, or <code dir="auto">usage</code> / <code dir="auto">not_found</code> / <code dir="auto">conflict</code> / <code dir="auto">invalid_domain_file</code></td>
|
|
280
280
|
<td><code dir="auto">spec move</code></td>
|
|
281
281
|
<td><code dir="auto">POST /api/requirements/:id/move</code></td>
|
|
282
282
|
<td><code dir="auto">spec_move</code></td>
|
|
@@ -284,7 +284,7 @@
|
|
|
284
284
|
<tr>
|
|
285
285
|
<td><code dir="auto">deprecate</code></td>
|
|
286
286
|
<td>platform dir, id, reason, a fresh-tags callback</td>
|
|
287
|
-
<td>the file and the tags
|
|
287
|
+
<td>the file and the removed tags, or <code dir="auto">not_found</code> / <code dir="auto">conflict</code> / <code dir="auto">invalid_domain_file</code></td>
|
|
288
288
|
<td><code dir="auto">spec deprecate</code></td>
|
|
289
289
|
<td><code dir="auto">POST /api/requirements/:id/deprecate</code></td>
|
|
290
290
|
<td><code dir="auto">spec_deprecate</code></td>
|
|
@@ -316,7 +316,7 @@
|
|
|
316
316
|
<tr>
|
|
317
317
|
<td><code dir="auto">getRecord</code></td>
|
|
318
318
|
<td>storage, requirement id</td>
|
|
319
|
-
<td>one full <code dir="auto">Requirement</code> row, or null</td>
|
|
319
|
+
<td>one full <code dir="auto">Requirement</code> row with its implementing and verifying tag sites, or null</td>
|
|
320
320
|
<td><code dir="auto">spec get</code></td>
|
|
321
321
|
<td><code dir="auto">GET /api/requirements/:id</code></td>
|
|
322
322
|
<td><code dir="auto">spec_get</code></td>
|
|
@@ -457,7 +457,7 @@
|
|
|
457
457
|
<li>Allocate the next id from the filesystem, never from the index.</li>
|
|
458
458
|
<li>Judge new statement text against the EARS grammar when the domain declares one.</li>
|
|
459
459
|
<li>Write the whole envelope through <code dir="auto">validateAndWrite</code>.</li>
|
|
460
|
-
<li>Lifecycle commands then reindex fresh and
|
|
460
|
+
<li>Lifecycle commands then reindex fresh and rewrite (or, for deprecate, remove) the tags of the ended id.</li>
|
|
461
461
|
</ol>
|
|
462
462
|
<div class="sl-heading-wrapper level-h2"><h2 id="http-path">HTTP path</h2><a class="sl-anchor-link" href="#http-path"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “HTTP path”</span></a></div>
|
|
463
463
|
<ol>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en" dir="ltr" data-theme="dark" data-has-toc data-has-sidebar class="astro-kmpt7d6z"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>Integrity Checks | Spec Engine</title><link rel="canonical" href="https://docs.spec-engine.dev/checks/"/><link rel="sitemap" href="/sitemap-index.xml"/><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="true"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Archivo:wght@600;700;800;900&family=IBM+Plex+Mono:wght@400;500;600&family=IBM+Plex+Sans:wght@400;500;600&display=swap"/><link rel="icon" href="/favicon.ico" sizes="any"/><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png"/><link rel="icon" type="image/png" sizes="16x16" href="/favicon-16.png"/><link rel="apple-touch-icon" sizes="180x180" href="/favicon-180.png"/><link rel="manifest" href="/site.webmanifest"/><link rel="shortcut icon" href="/favicon.svg" type="image/svg+xml"/><meta name="generator" content="Astro v7.2.8"/><meta name="generator" content="Starlight v0.40.0"/><meta property="og:title" content="Integrity Checks"/><meta property="og:type" content="article"/><meta property="og:url" content="https://docs.spec-engine.dev/checks/"/><meta property="og:locale" content="en"/><meta property="og:description" content="
|
|
1
|
+
<!DOCTYPE html><html lang="en" dir="ltr" data-theme="dark" data-has-toc data-has-sidebar class="astro-kmpt7d6z"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>Integrity Checks | Spec Engine</title><link rel="canonical" href="https://docs.spec-engine.dev/checks/"/><link rel="sitemap" href="/sitemap-index.xml"/><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="true"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Archivo:wght@600;700;800;900&family=IBM+Plex+Mono:wght@400;500;600&family=IBM+Plex+Sans:wght@400;500;600&display=swap"/><link rel="icon" href="/favicon.ico" sizes="any"/><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png"/><link rel="icon" type="image/png" sizes="16x16" href="/favicon-16.png"/><link rel="apple-touch-icon" sizes="180x180" href="/favicon-180.png"/><link rel="manifest" href="/site.webmanifest"/><link rel="shortcut icon" href="/favicon.svg" type="image/svg+xml"/><meta name="generator" content="Astro v7.2.8"/><meta name="generator" content="Starlight v0.40.0"/><meta property="og:title" content="Integrity Checks"/><meta property="og:type" content="article"/><meta property="og:url" content="https://docs.spec-engine.dev/checks/"/><meta property="og:locale" content="en"/><meta property="og:description" content="What spec check reports and how to run it in CI"/><meta property="og:site_name" content="Spec Engine"/><meta name="twitter:card" content="summary_large_image"/><meta name="description" content="What spec check reports and how to run it in CI"/><meta name="theme-color" content="#0F1214"/><meta property="og:image" content="https://docs.spec-engine.dev/og-spec-engine-docs.png"/><meta property="og:image:width" content="1200"/><meta property="og:image:height" content="630"/><meta name="twitter:image" content="https://docs.spec-engine.dev/og-spec-engine-docs.png"/><script>
|
|
2
2
|
window.StarlightThemeProvider = (() => {
|
|
3
3
|
const storedTheme =
|
|
4
4
|
typeof localStorage !== 'undefined' && localStorage.getItem('starlight-theme');
|
|
@@ -70,269 +70,22 @@
|
|
|
70
70
|
})();
|
|
71
71
|
</script></sl-sidebar-state-persist><div class="md:sl-hidden"><div class="mobile-preferences sl-flex astro-hclhd3l6"><div class="social-icons astro-hclhd3l6"><a href="https://github.com/spec-engine/spec-engine" rel="me" class="sl-flex astro-n6yxnlqb"><span class="sr-only astro-n6yxnlqb">GitHub</span><svg aria-hidden="true" class="astro-n6yxnlqb astro-ica5m7eu" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M12 .3a12 12 0 0 0-3.8 23.38c.6.12.83-.26.83-.57L9 21.07c-3.34.72-4.04-1.61-4.04-1.61-.55-1.39-1.34-1.76-1.34-1.76-1.08-.74.09-.73.09-.73 1.2.09 1.83 1.24 1.83 1.24 1.08 1.83 2.81 1.3 3.5 1 .1-.78.42-1.31.76-1.61-2.67-.3-5.47-1.33-5.47-5.93 0-1.31.47-2.38 1.24-3.22-.14-.3-.54-1.52.1-3.18 0 0 1-.32 3.3 1.23a11.5 11.5 0 0 1 6 0c2.28-1.55 3.29-1.23 3.29-1.23.64 1.66.24 2.88.12 3.18a4.65 4.65 0 0 1 1.23 3.22c0 4.61-2.8 5.63-5.48 5.92.42.36.81 1.1.81 2.22l-.01 3.29c0 .31.2.69.82.57A12 12 0 0 0 12 .3Z"/></svg></a></div><starlight-theme-select><label style="--sl-select-width: 6.25em" class="astro-bqlrlpix"><span class="sr-only astro-bqlrlpix">Select theme</span><svg aria-hidden="true" class="icon label-icon astro-bqlrlpix astro-ica5m7eu" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z"/></svg><select autocomplete="off" class="astro-bqlrlpix"><option value="dark" class="astro-bqlrlpix">Dark</option><option value="light" class="astro-bqlrlpix">Light</option><option value="auto" selected class="astro-bqlrlpix">Auto</option></select><svg aria-hidden="true" class="icon caret astro-bqlrlpix astro-ica5m7eu" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M17 9.17a1 1 0 0 0-1.41 0L12 12.71 8.46 9.17a1 1 0 1 0-1.41 1.42l4.24 4.24a1.002 1.002 0 0 0 1.42 0L17 10.59a1.002 1.002 0 0 0 0-1.42Z"/></svg></label></starlight-theme-select><script>
|
|
72
72
|
StarlightThemeProvider.updatePickers();
|
|
73
|
-
</script></div></div></div></div></nav><div class="main-frame astro-qobrlvtk"><script type="module">var e=document.getElementById(`starlight__sidebar`),t=e?.querySelector(`sl-sidebar-state-persist`),n=`sl-sidebar-state`,r=()=>{let r=[],i=t?.dataset.hash||``;try{let e=sessionStorage.getItem(n),t=JSON.parse(e||`{}`);Array.isArray(t.open)&&t.hash===i&&(r=t.open)}catch{}return{hash:i,open:r,scroll:e?.scrollTop||0}},i=e=>{try{sessionStorage.setItem(n,JSON.stringify(e))}catch{}},a=()=>i(r()),o=(e,t)=>{let n=r();n.open[t]=e,i(n)};t?.addEventListener(`click`,e=>{if(!(e.target instanceof Element))return;let t=e.target.closest(`summary`)?.closest(`details`);if(!t)return;let n=t.querySelector(`sl-sidebar-restore`),r=parseInt(n?.dataset.index||``);isNaN(r)||o(!t.open,r)}),addEventListener(`visibilitychange`,()=>{document.visibilityState===`hidden`&&a()}),addEventListener(`pageHide`,a);</script><div class="lg:sl-flex astro-iv7ihhtf"><aside class="right-sidebar-container print:hidden astro-iv7ihhtf"><div class="right-sidebar astro-iv7ihhtf"><div class="lg:sl-hidden astro-dfaa6j3s"><mobile-starlight-toc data-min-h="2" data-max-h="3" class="astro-hhhdejk6"><nav aria-labelledby="starlight__on-this-page--mobile" class="astro-hhhdejk6"><details id="starlight__mobile-toc" class="astro-hhhdejk6"><summary id="starlight__on-this-page--mobile" class="sl-flex astro-hhhdejk6"><span class="toggle sl-flex astro-hhhdejk6">On this page<svg aria-hidden="true" class="caret astro-hhhdejk6 astro-ica5m7eu" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg></span><span class="display-current astro-hhhdejk6"></span></summary><div class="dropdown astro-hhhdejk6"><ul class="isMobile astro-l6rvz6dz" style="--depth: 0;"><li style="--depth: 0;" class="astro-l6rvz6dz"><a href="#_top" style="--depth: 0;" class="astro-l6rvz6dz"><span style="--depth: 0;" class="astro-l6rvz6dz">Overview</span></a></li><li style="--depth: 0;" class="astro-l6rvz6dz"><a href="#
|
|
74
|
-
<
|
|
75
|
-
<
|
|
76
|
-
<
|
|
77
|
-
<
|
|
78
|
-
<
|
|
79
|
-
<
|
|
80
|
-
<
|
|
81
|
-
</
|
|
82
|
-
</
|
|
83
|
-
<
|
|
84
|
-
<
|
|
85
|
-
<
|
|
86
|
-
<
|
|
87
|
-
<
|
|
88
|
-
</
|
|
89
|
-
<
|
|
90
|
-
<
|
|
91
|
-
<td>error</td>
|
|
92
|
-
<td>The same requirement ID appears twice</td>
|
|
93
|
-
</tr>
|
|
94
|
-
<tr>
|
|
95
|
-
<td><code dir="auto">BROKEN_SUPERSEDE</code></td>
|
|
96
|
-
<td>error</td>
|
|
97
|
-
<td><code dir="auto">supersededBy</code> points at a missing ID</td>
|
|
98
|
-
</tr>
|
|
99
|
-
<tr>
|
|
100
|
-
<td><code dir="auto">CYCLIC_SUPERSEDE</code></td>
|
|
101
|
-
<td>error</td>
|
|
102
|
-
<td>A circular supersession chain (<code dir="auto">A → B → A</code>) — the chain is the change history, so a cycle is corrupt history</td>
|
|
103
|
-
</tr>
|
|
104
|
-
<tr>
|
|
105
|
-
<td><code dir="auto">BAD_STATUS</code></td>
|
|
106
|
-
<td>error</td>
|
|
107
|
-
<td>Entry status outside <code dir="auto">active</code> / <code dir="auto">draft</code> / <code dir="auto">superseded</code> / <code dir="auto">deprecated</code></td>
|
|
108
|
-
</tr>
|
|
109
|
-
<tr>
|
|
110
|
-
<td><code dir="auto">DANGLING_TAG</code></td>
|
|
111
|
-
<td>error</td>
|
|
112
|
-
<td>A <code dir="auto">@spec</code> tag references no requirement</td>
|
|
113
|
-
</tr>
|
|
114
|
-
<tr>
|
|
115
|
-
<td><code dir="auto">SUPERSEDED_REFERENCED</code></td>
|
|
116
|
-
<td>error</td>
|
|
117
|
-
<td>Code still tags a superseded requirement (retag to the successor)</td>
|
|
118
|
-
</tr>
|
|
119
|
-
<tr>
|
|
120
|
-
<td><code dir="auto">ORPHAN_REQ</code></td>
|
|
121
|
-
<td>error</td>
|
|
122
|
-
<td>An active requirement has no implementing <code dir="auto">@spec</code> tag</td>
|
|
123
|
-
</tr>
|
|
124
|
-
<tr>
|
|
125
|
-
<td><code dir="auto">UNVERIFIED_REQ</code></td>
|
|
126
|
-
<td>warning</td>
|
|
127
|
-
<td>An active requirement is implemented but has no verifying test tag</td>
|
|
128
|
-
</tr>
|
|
129
|
-
<tr>
|
|
130
|
-
<td><code dir="auto">DRAFT_REFERENCED</code></td>
|
|
131
|
-
<td>error / warning</td>
|
|
132
|
-
<td>A tag references a draft requirement: error on a verifying (test) tag, warning on an implementing or documenting tag</td>
|
|
133
|
-
</tr>
|
|
134
|
-
<tr>
|
|
135
|
-
<td><code dir="auto">DRIFT</code></td>
|
|
136
|
-
<td>error</td>
|
|
137
|
-
<td>A member is pinned behind the version at which a requirement it references changed</td>
|
|
138
|
-
</tr>
|
|
139
|
-
<tr>
|
|
140
|
-
<td><code dir="auto">BROKEN_FILE_REF</code></td>
|
|
141
|
-
<td>error</td>
|
|
142
|
-
<td>An active or draft requirement’s <code dir="auto">livesIn</code> or <code dir="auto">verifiedIn</code> entry does not resolve to a file under the platform root (a terminal-status entry is exempt)</td>
|
|
143
|
-
</tr>
|
|
144
|
-
<tr>
|
|
145
|
-
<td><code dir="auto">UNIMPLEMENTED_IN_FILE</code></td>
|
|
146
|
-
<td>warning</td>
|
|
147
|
-
<td>An active requirement’s <code dir="auto">livesIn</code> entry names a file the scanner reads, and that file holds no implementing or documenting tag for the requirement</td>
|
|
148
|
-
</tr>
|
|
149
|
-
<tr>
|
|
150
|
-
<td><code dir="auto">UNVERIFIED_IN_FILE</code></td>
|
|
151
|
-
<td>warning</td>
|
|
152
|
-
<td>An active requirement’s <code dir="auto">verifiedIn</code> entry names a file the scanner reads, and that file holds no verifying tag for the requirement</td>
|
|
153
|
-
</tr>
|
|
154
|
-
<tr>
|
|
155
|
-
<td><code dir="auto">NO_SPEC_CONFIG</code></td>
|
|
156
|
-
<td>warning</td>
|
|
157
|
-
<td>A declared member is present on disk with no <code dir="auto">spec-engine.member.json</code></td>
|
|
158
|
-
</tr>
|
|
159
|
-
<tr>
|
|
160
|
-
<td><code dir="auto">MALFORMED_FILE</code></td>
|
|
161
|
-
<td>error (warning for a manifest)</td>
|
|
162
|
-
<td>A <code dir="auto">platform-map.json</code>, a package or workspace manifest, or platform-map’s per-user file failed to parse or validate</td>
|
|
163
|
-
</tr>
|
|
164
|
-
<tr>
|
|
165
|
-
<td><code dir="auto">MARKER_MISMATCH</code></td>
|
|
166
|
-
<td>error</td>
|
|
167
|
-
<td>A member’s <code dir="auto">platform-map.json</code> marker names a different platform</td>
|
|
168
|
-
</tr>
|
|
169
|
-
<tr>
|
|
170
|
-
<td><code dir="auto">MEMBER_MISSING</code></td>
|
|
171
|
-
<td>warning</td>
|
|
172
|
-
<td>A declared member is not on this machine; it is not scanned</td>
|
|
173
|
-
</tr>
|
|
174
|
-
<tr>
|
|
175
|
-
<td><code dir="auto">MARKER_MISSING</code></td>
|
|
176
|
-
<td>warning</td>
|
|
177
|
-
<td>A declared member has no <code dir="auto">platform-map.json</code> marker</td>
|
|
178
|
-
</tr>
|
|
179
|
-
<tr>
|
|
180
|
-
<td><code dir="auto">PLATFORM_NOT_LOCATED</code></td>
|
|
181
|
-
<td>warning</td>
|
|
182
|
-
<td>A marker names a platform this machine cannot find</td>
|
|
183
|
-
</tr>
|
|
184
|
-
<tr>
|
|
185
|
-
<td><code dir="auto">SCAN_TRUNCATED</code></td>
|
|
186
|
-
<td>warning</td>
|
|
187
|
-
<td>A workspace walk hit its depth or entry cap</td>
|
|
188
|
-
</tr>
|
|
189
|
-
<tr>
|
|
190
|
-
<td><code dir="auto">UNLISTED_REPO</code></td>
|
|
191
|
-
<td>warning</td>
|
|
192
|
-
<td>A repository in the platform folder is not a member; its tags are not scanned until <code dir="auto">spec init <name></code> declares it</td>
|
|
193
|
-
</tr>
|
|
194
|
-
<tr>
|
|
195
|
-
<td><code dir="auto">UNDECLARED_PLATFORM</code></td>
|
|
196
|
-
<td>warning</td>
|
|
197
|
-
<td>A folder of repositories with no platform file; nothing in it is a member until <code dir="auto">spec init <name></code> declares the first one</td>
|
|
198
|
-
</tr>
|
|
199
|
-
<tr>
|
|
200
|
-
<td><code dir="auto">BROKEN_RELATES</code></td>
|
|
201
|
-
<td>warning</td>
|
|
202
|
-
<td>A <code dir="auto">relates</code> entry points at a nonexistent requirement ID</td>
|
|
203
|
-
</tr>
|
|
204
|
-
<tr>
|
|
205
|
-
<td><code dir="auto">RELATES_SUPERSEDED</code></td>
|
|
206
|
-
<td>warning</td>
|
|
207
|
-
<td>A <code dir="auto">relates</code> entry points at a superseded requirement</td>
|
|
208
|
-
</tr>
|
|
209
|
-
<tr>
|
|
210
|
-
<td><code dir="auto">SELF_RELATES</code></td>
|
|
211
|
-
<td>warning</td>
|
|
212
|
-
<td>A <code dir="auto">relates</code> entry names its own requirement (dropped, but surfaced)</td>
|
|
213
|
-
</tr>
|
|
214
|
-
<tr>
|
|
215
|
-
<td><code dir="auto">UNKNOWN_ROLE</code></td>
|
|
216
|
-
<td>warning</td>
|
|
217
|
-
<td>An <code dir="auto">issues</code> entry uses a role outside <code dir="auto">created</code> / <code dir="auto">supersedes-via</code> / <code dir="auto">amends-via</code> — surfaced and dropped, never stored</td>
|
|
218
|
-
</tr>
|
|
219
|
-
</tbody>
|
|
220
|
-
</table>
|
|
221
|
-
<p>Coverage counts only active requirements: a draft never raises <code dir="auto">ORPHAN_REQ</code> or <code dir="auto">UNVERIFIED_REQ</code>. <!-- @spec CHCK-032 --></p>
|
|
222
|
-
<div class="sl-heading-wrapper level-h2"><h2 id="glossary-term-diagnostics">Glossary (TERM) diagnostics</h2><a class="sl-anchor-link" href="#glossary-term-diagnostics"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “Glossary (TERM) diagnostics”</span></a></div>
|
|
223
|
-
<table>
|
|
224
|
-
<thead>
|
|
225
|
-
<tr>
|
|
226
|
-
<th>Code</th>
|
|
227
|
-
<th>Severity</th>
|
|
228
|
-
<th>Condition</th>
|
|
229
|
-
</tr>
|
|
230
|
-
</thead>
|
|
231
|
-
<tbody>
|
|
232
|
-
<tr>
|
|
233
|
-
<td><code dir="auto">UNDEFINED_TERM</code></td>
|
|
234
|
-
<td>error</td>
|
|
235
|
-
<td>A requirement’s <code dir="auto">cites</code> entry resolves to no glossary TERM</td>
|
|
236
|
-
</tr>
|
|
237
|
-
<tr>
|
|
238
|
-
<td><code dir="auto">SUPERSEDED_TERM_REFERENCED</code></td>
|
|
239
|
-
<td>error</td>
|
|
240
|
-
<td>A citation points at a superseded term ID — re-point with <code dir="auto">spec term confirm</code></td>
|
|
241
|
-
</tr>
|
|
242
|
-
<tr>
|
|
243
|
-
<td><code dir="auto">TERM_DRIFT</code></td>
|
|
244
|
-
<td>warning</td>
|
|
245
|
-
<td>A citation’s pin lags the cited term’s current version after <code dir="auto">spec term revise</code> — a re-confirmation prompt, not a build-breaker</td>
|
|
246
|
-
</tr>
|
|
247
|
-
<tr>
|
|
248
|
-
<td><code dir="auto">ORPHAN_TERM</code></td>
|
|
249
|
-
<td>warning</td>
|
|
250
|
-
<td>An active TERM no requirement cites — glossary rot, deliberately non-fatal</td>
|
|
251
|
-
</tr>
|
|
252
|
-
</tbody>
|
|
253
|
-
</table>
|
|
254
|
-
<div class="sl-heading-wrapper level-h2"><h2 id="trusted-red-proof-gate---results-junitxml">Trusted-red proof gate (<code dir="auto">--results <junit.xml></code>)</h2><a class="sl-anchor-link" href="#trusted-red-proof-gate---results-junitxml"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “Trusted-red proof gate (--results <junit.xml>)”</span></a></div>
|
|
255
|
-
<p>Pass your test runner’s JUnit XML and <code dir="auto">check</code> enforces <strong>proof of passing</strong> — a verifying tag only counts when its test actually passed:</p>
|
|
256
|
-
<table>
|
|
257
|
-
<thead>
|
|
258
|
-
<tr>
|
|
259
|
-
<th>Code</th>
|
|
260
|
-
<th>Severity</th>
|
|
261
|
-
<th>Condition</th>
|
|
262
|
-
</tr>
|
|
263
|
-
</thead>
|
|
264
|
-
<tbody>
|
|
265
|
-
<tr>
|
|
266
|
-
<td><code dir="auto">UNPROVEN_REQ</code></td>
|
|
267
|
-
<td>error</td>
|
|
268
|
-
<td>An active requirement has verifying tags but no <em>passing</em> correlated test</td>
|
|
269
|
-
</tr>
|
|
270
|
-
<tr>
|
|
271
|
-
<td><code dir="auto">PROOFS_UNCONFIRMED</code></td>
|
|
272
|
-
<td>warning</td>
|
|
273
|
-
<td>No <code dir="auto">--results</code> supplied — the gate falls back to presence-only mode (this warning is the reminder; routed to stderr under <code dir="auto">--json</code>)</td>
|
|
274
|
-
</tr>
|
|
275
|
-
</tbody>
|
|
276
|
-
</table>
|
|
277
|
-
<div class="expressive-code"><link rel="stylesheet" href="/_astro/ec.v4551.css"><script type="module" src="/_astro/ec.0vx5m.js"></script><figure class="frame is-terminal not-content"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">bun</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">test</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--reporter=junit</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--reporter-outfile=.spec-engine/results.xml</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">spec</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">check</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">.</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--ci</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--results</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">.spec-engine/results.xml</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="bun test --reporter=junit --reporter-outfile=.spec-engine/results.xmlspec check . --ci --results .spec-engine/results.xml"><div></div></button></div></figure></div>
|
|
278
|
-
<div class="sl-heading-wrapper level-h2"><h2 id="governance-diagnostics---base-ref">Governance diagnostics (<code dir="auto">--base <ref></code>)</h2><a class="sl-anchor-link" href="#governance-diagnostics---base-ref"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “Governance diagnostics (--base <ref>)”</span></a></div>
|
|
279
|
-
<p>With a git base ref, <code dir="auto">check</code> also diffs the requirement set against that ref. Without <code dir="auto">--base</code>, the removal and loss rows are computed against <code dir="auto">HEAD</code> whenever git resolves:</p>
|
|
280
|
-
<table>
|
|
281
|
-
<thead>
|
|
282
|
-
<tr>
|
|
283
|
-
<th>Code</th>
|
|
284
|
-
<th>Severity</th>
|
|
285
|
-
<th>Condition</th>
|
|
286
|
-
</tr>
|
|
287
|
-
</thead>
|
|
288
|
-
<tbody>
|
|
289
|
-
<tr>
|
|
290
|
-
<td><code dir="auto">REQUIREMENT_REMOVED</code></td>
|
|
291
|
-
<td>error</td>
|
|
292
|
-
<td>A requirement present at the base ref is gone with no approved supersession</td>
|
|
293
|
-
</tr>
|
|
294
|
-
<tr>
|
|
295
|
-
<td><code dir="auto">UNAPPROVED_STATUS_FLIP</code></td>
|
|
296
|
-
<td>warning†</td>
|
|
297
|
-
<td>A flip to superseded/deprecated whose CODEOWNERS domain owner is absent from <code dir="auto">--approved-by</code> — †error under <code dir="auto">--require-owner-approval</code></td>
|
|
298
|
-
</tr>
|
|
299
|
-
<tr>
|
|
300
|
-
<td><code dir="auto">PARTIAL_PROPAGATION</code></td>
|
|
301
|
-
<td>error</td>
|
|
302
|
-
<td>Needs <code dir="auto">--base</code> <strong>and</strong> <code dir="auto">--results</code>: a changed requirement where some bound tests pass and some fail — one site migrated, another still red</td>
|
|
303
|
-
</tr>
|
|
304
|
-
</tbody>
|
|
305
|
-
</table>
|
|
306
|
-
<p>| <code dir="auto">IMPL_LOST</code> | error | The change removes the last implementing tag of a surviving active requirement |
|
|
307
|
-
| <code dir="auto">VERIFY_LOST</code> | warning | The change removes the last verifying tag of a surviving active requirement |
|
|
308
|
-
| <code dir="auto">SPEC_FILE_DELETED</code> | error | A <code dir="auto">SPEC.json</code> present at the base ref is gone |</p>
|
|
309
|
-
<p>The three loss rows are the ones <code dir="auto">spec guard</code> reports against the same ref; guard’s own <code dir="auto">REQUIREMENT_REMOVED</code> row is not repeated. See <a href="/commands/#spec-guard-platformdir">Commands</a>.</p>
|
|
310
|
-
<div class="sl-heading-wrapper level-h2"><h2 id="opt-in-policy-diagnostics">Opt-in policy diagnostics</h2><a class="sl-anchor-link" href="#opt-in-policy-diagnostics"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “Opt-in policy diagnostics”</span></a></div>
|
|
311
|
-
<table>
|
|
312
|
-
<thead>
|
|
313
|
-
<tr>
|
|
314
|
-
<th>Code</th>
|
|
315
|
-
<th>Severity</th>
|
|
316
|
-
<th>Condition</th>
|
|
317
|
-
</tr>
|
|
318
|
-
</thead>
|
|
319
|
-
<tbody>
|
|
320
|
-
<tr>
|
|
321
|
-
<td><code dir="auto">UNSOURCED_CHANGE</code></td>
|
|
322
|
-
<td>warning</td>
|
|
323
|
-
<td>A superseded requirement carries no <code dir="auto">supersedes-via</code> issue. Emitted only under <code dir="auto">spec check --unsourced-change</code></td>
|
|
324
|
-
</tr>
|
|
325
|
-
</tbody>
|
|
326
|
-
</table>
|
|
327
|
-
<div class="sl-heading-wrapper level-h2"><h2 id="severity-policy-spec-enginecheckjson">Severity policy (<code dir="auto">spec-engine/check.json</code>)</h2><a class="sl-anchor-link" href="#severity-policy-spec-enginecheckjson"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “Severity policy (spec-engine/check.json)”</span></a></div>
|
|
328
|
-
<p><code dir="auto">spec-engine/check.json</code> regrades diagnostics. Absent means no rules.</p>
|
|
329
|
-
<div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="json"><code><div class="ec-line"><div class="code"><span style="--0:#D6DEEB;--1:#403F53">{ </span><span style="--0:#7FDBCA;--1:#096E72">"severity"</span><span style="--0:#D6DEEB;--1:#403F53">: [</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">{ </span><span style="--0:#7FDBCA;--1:#096E72">"code"</span><span style="--0:#D6DEEB;--1:#403F53">: </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#C789D6;--1:#7C5686">UNVERIFIED_REQ</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#D6DEEB;--1:#403F53">, </span><span style="--0:#7FDBCA;--1:#096E72">"severity"</span><span style="--0:#D6DEEB;--1:#403F53">: </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#C789D6;--1:#7C5686">error</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#D6DEEB;--1:#403F53"> },</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">{ </span><span style="--0:#7FDBCA;--1:#096E72">"code"</span><span style="--0:#D6DEEB;--1:#403F53">: </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#C789D6;--1:#7C5686">UNVERIFIED_REQ</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#D6DEEB;--1:#403F53">, </span><span style="--0:#7FDBCA;--1:#096E72">"severity"</span><span style="--0:#D6DEEB;--1:#403F53">: </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#C789D6;--1:#7C5686">warning</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#D6DEEB;--1:#403F53">, </span><span style="--0:#7FDBCA;--1:#096E72">"match"</span><span style="--0:#D6DEEB;--1:#403F53">: [</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#C789D6;--1:#7C5686">LEGACY</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#D6DEEB;--1:#403F53">, </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#C789D6;--1:#7C5686">BILLING-004</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#D6DEEB;--1:#403F53">] }</span></div></div><div class="ec-line"><div class="code"><span style="--0:#D6DEEB;--1:#403F53">] }</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="{ "severity": [ { "code": "UNVERIFIED_REQ", "severity": "error" }, { "code": "UNVERIFIED_REQ", "severity": "warning", "match": ["LEGACY", "BILLING-004"] }] }"><div></div></button></div></figure></div>
|
|
330
|
-
<ul>
|
|
331
|
-
<li><code dir="auto">code</code> is any diagnostic code; <code dir="auto">severity</code> is <code dir="auto">error</code>, <code dir="auto">warning</code>, or <code dir="auto">off</code>.</li>
|
|
332
|
-
<li><code dir="auto">match</code> lists domain keys and requirement ids. A scoped rule applies only to rows whose requirement is listed or carries a listed key.</li>
|
|
333
|
-
<li>The most specific rule wins: an id match, then a domain match, then an unscoped rule. Among equals, the later rule wins.</li>
|
|
334
|
-
<li><code dir="auto">off</code> drops the row from every output.</li>
|
|
335
|
-
<li>Exit 1 follows the graded severities, on every surface.</li>
|
|
336
|
-
<li>A file that fails the schema exits 2 with <code dir="auto">spec-engine/check.json: <path>: <reason></code>.</li>
|
|
337
|
-
</ul>
|
|
73
|
+
</script></div></div></div></div></nav><div class="main-frame astro-qobrlvtk"><script type="module">var e=document.getElementById(`starlight__sidebar`),t=e?.querySelector(`sl-sidebar-state-persist`),n=`sl-sidebar-state`,r=()=>{let r=[],i=t?.dataset.hash||``;try{let e=sessionStorage.getItem(n),t=JSON.parse(e||`{}`);Array.isArray(t.open)&&t.hash===i&&(r=t.open)}catch{}return{hash:i,open:r,scroll:e?.scrollTop||0}},i=e=>{try{sessionStorage.setItem(n,JSON.stringify(e))}catch{}},a=()=>i(r()),o=(e,t)=>{let n=r();n.open[t]=e,i(n)};t?.addEventListener(`click`,e=>{if(!(e.target instanceof Element))return;let t=e.target.closest(`summary`)?.closest(`details`);if(!t)return;let n=t.querySelector(`sl-sidebar-restore`),r=parseInt(n?.dataset.index||``);isNaN(r)||o(!t.open,r)}),addEventListener(`visibilitychange`,()=>{document.visibilityState===`hidden`&&a()}),addEventListener(`pageHide`,a);</script><div class="lg:sl-flex astro-iv7ihhtf"><aside class="right-sidebar-container print:hidden astro-iv7ihhtf"><div class="right-sidebar astro-iv7ihhtf"><div class="lg:sl-hidden astro-dfaa6j3s"><mobile-starlight-toc data-min-h="2" data-max-h="3" class="astro-hhhdejk6"><nav aria-labelledby="starlight__on-this-page--mobile" class="astro-hhhdejk6"><details id="starlight__mobile-toc" class="astro-hhhdejk6"><summary id="starlight__on-this-page--mobile" class="sl-flex astro-hhhdejk6"><span class="toggle sl-flex astro-hhhdejk6">On this page<svg aria-hidden="true" class="caret astro-hhhdejk6 astro-ica5m7eu" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg></span><span class="display-current astro-hhhdejk6"></span></summary><div class="dropdown astro-hhhdejk6"><ul class="isMobile astro-l6rvz6dz" style="--depth: 0;"><li style="--depth: 0;" class="astro-l6rvz6dz"><a href="#_top" style="--depth: 0;" class="astro-l6rvz6dz"><span style="--depth: 0;" class="astro-l6rvz6dz">Overview</span></a></li><li style="--depth: 0;" class="astro-l6rvz6dz"><a href="#in-ci" style="--depth: 0;" class="astro-l6rvz6dz"><span style="--depth: 0;" class="astro-l6rvz6dz">In CI</span></a></li><li style="--depth: 0;" class="astro-l6rvz6dz"><a href="#integrity-and-coverage" style="--depth: 0;" class="astro-l6rvz6dz"><span style="--depth: 0;" class="astro-l6rvz6dz">Integrity and coverage</span></a></li><li style="--depth: 0;" class="astro-l6rvz6dz"><a href="#proof-of-passing---results" style="--depth: 0;" class="astro-l6rvz6dz"><span style="--depth: 0;" class="astro-l6rvz6dz">Proof of passing (--results)</span></a></li><li style="--depth: 0;" class="astro-l6rvz6dz"><a href="#governance---base" style="--depth: 0;" class="astro-l6rvz6dz"><span style="--depth: 0;" class="astro-l6rvz6dz">Governance (--base)</span></a></li><li style="--depth: 0;" class="astro-l6rvz6dz"><a href="#platform-and-glossary" style="--depth: 0;" class="astro-l6rvz6dz"><span style="--depth: 0;" class="astro-l6rvz6dz">Platform and glossary</span></a></li><li style="--depth: 0;" class="astro-l6rvz6dz"><a href="#statement-rules" style="--depth: 0;" class="astro-l6rvz6dz"><span style="--depth: 0;" class="astro-l6rvz6dz">Statement rules</span></a></li><li style="--depth: 0;" class="astro-l6rvz6dz"><a href="#regrading-spec-enginecheckjson" style="--depth: 0;" class="astro-l6rvz6dz"><span style="--depth: 0;" class="astro-l6rvz6dz">Regrading (spec-engine/check.json)</span></a></li></ul></div></details></nav></mobile-starlight-toc><script type="module" src="/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.BcSo_yiZ.js"></script></div><div class="right-sidebar-panel sl-hidden lg:sl-block astro-dfaa6j3s"><div class="sl-container astro-dfaa6j3s"><starlight-toc data-min-h="2" data-max-h="3"><nav aria-labelledby="starlight__on-this-page"><h2 id="starlight__on-this-page">On this page</h2><ul class="astro-l6rvz6dz" style="--depth: 0;"><li style="--depth: 0;" class="astro-l6rvz6dz"><a href="#_top" style="--depth: 0;" class="astro-l6rvz6dz"><span style="--depth: 0;" class="astro-l6rvz6dz">Overview</span></a></li><li style="--depth: 0;" class="astro-l6rvz6dz"><a href="#in-ci" style="--depth: 0;" class="astro-l6rvz6dz"><span style="--depth: 0;" class="astro-l6rvz6dz">In CI</span></a></li><li style="--depth: 0;" class="astro-l6rvz6dz"><a href="#integrity-and-coverage" style="--depth: 0;" class="astro-l6rvz6dz"><span style="--depth: 0;" class="astro-l6rvz6dz">Integrity and coverage</span></a></li><li style="--depth: 0;" class="astro-l6rvz6dz"><a href="#proof-of-passing---results" style="--depth: 0;" class="astro-l6rvz6dz"><span style="--depth: 0;" class="astro-l6rvz6dz">Proof of passing (--results)</span></a></li><li style="--depth: 0;" class="astro-l6rvz6dz"><a href="#governance---base" style="--depth: 0;" class="astro-l6rvz6dz"><span style="--depth: 0;" class="astro-l6rvz6dz">Governance (--base)</span></a></li><li style="--depth: 0;" class="astro-l6rvz6dz"><a href="#platform-and-glossary" style="--depth: 0;" class="astro-l6rvz6dz"><span style="--depth: 0;" class="astro-l6rvz6dz">Platform and glossary</span></a></li><li style="--depth: 0;" class="astro-l6rvz6dz"><a href="#statement-rules" style="--depth: 0;" class="astro-l6rvz6dz"><span style="--depth: 0;" class="astro-l6rvz6dz">Statement rules</span></a></li><li style="--depth: 0;" class="astro-l6rvz6dz"><a href="#regrading-spec-enginecheckjson" style="--depth: 0;" class="astro-l6rvz6dz"><span style="--depth: 0;" class="astro-l6rvz6dz">Regrading (spec-engine/check.json)</span></a></li></ul></nav></starlight-toc><script type="module" src="/_astro/TableOfContents.astro_astro_type_script_index_0_lang.Csloo1VZ.js"></script></div></div></div></aside><div class="main-pane astro-iv7ihhtf"><main data-pagefind-body class="astro-kmpt7d6z" lang="en" dir="ltr"><div class="content-panel astro-d3w5v5qg"><div class="sl-container astro-d3w5v5qg"><h1 id="_top" class="astro-elp5pbgd">Integrity Checks</h1></div></div><div class="content-panel astro-d3w5v5qg"><div class="sl-container astro-d3w5v5qg"><div class="sl-markdown-content"><p><code dir="auto">spec check</code> reads every <code dir="auto">SPEC.json</code> and every tag on the platform and reports what does not hold together: a tag on a requirement that no longer exists, a requirement nothing implements or tests, a member pinned behind a change, a change that deletes a promise. Error-severity diagnostics exit 1; warnings alone exit 0.</p>
|
|
74
|
+
<p>Every code, its severity, and its condition is in the <a href="/agent-reference/#spec-check">Agent Reference</a>, which is the one copy of that list. This page explains the groups and how to run them.</p>
|
|
75
|
+
<div class="sl-heading-wrapper level-h2"><h2 id="in-ci">In CI</h2><a class="sl-anchor-link" href="#in-ci"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “In CI”</span></a></div>
|
|
76
|
+
<div class="expressive-code"><link rel="stylesheet" href="/_astro/ec.v4551.css"><script type="module" src="/_astro/ec.0vx5m.js"></script><figure class="frame is-terminal not-content"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">spec</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">check</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">.</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--ci</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--base</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#ECC48D;--1:#984E4D">$(</span><span style="--0:#82AAFF;--1:#3B61B0">git</span><span style="--0:#ECC48D;--1:#984E4D"> </span><span style="--0:#ECC48D;--1:#3B61B0">merge-base</span><span style="--0:#ECC48D;--1:#984E4D"> </span><span style="--0:#ECC48D;--1:#3B61B0">HEAD</span><span style="--0:#ECC48D;--1:#984E4D"> </span><span style="--0:#ECC48D;--1:#3B61B0">origin/main</span><span style="--0:#ECC48D;--1:#984E4D">)</span><span style="--0:#D9F5DD;--1:#111111">"</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="spec check . --ci --base "$(git merge-base HEAD origin/main)""><div></div></button></div></figure></div>
|
|
77
|
+
<p><code dir="auto">--ci</code> deletes the index first, so the result never depends on a warm index. <code dir="auto">--base</code> diffs the requirement set against the point the branch left <code dir="auto">main</code>. Without it, <code dir="auto">check</code> diffs against <code dir="auto">HEAD</code>, which in a CI checkout already holds the change, so the removal and loss checks have nothing to report.</p>
|
|
78
|
+
<div class="sl-heading-wrapper level-h2"><h2 id="integrity-and-coverage">Integrity and coverage</h2><a class="sl-anchor-link" href="#integrity-and-coverage"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “Integrity and coverage”</span></a></div>
|
|
79
|
+
<p>Always on. A duplicate id, a broken or cyclic supersede chain, a tag that names no requirement or a superseded or deprecated one, an Active requirement with no implementing tag (<code dir="auto">ORPHAN_REQ</code>) or no verifying tag (<code dir="auto">UNVERIFIED_REQ</code>), and a member pinned behind a changed requirement (<code dir="auto">DRIFT</code>). Coverage counts only Active requirements: a draft never raises <code dir="auto">ORPHAN_REQ</code> or <code dir="auto">UNVERIFIED_REQ</code>. <!-- @spec CHCK-032 --></p>
|
|
80
|
+
<div class="sl-heading-wrapper level-h2"><h2 id="proof-of-passing---results">Proof of passing (<code dir="auto">--results</code>)</h2><a class="sl-anchor-link" href="#proof-of-passing---results"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “Proof of passing (--results)”</span></a></div>
|
|
81
|
+
<p>By default a verifying tag counts when it exists. Pass the test runner’s JUnit XML and a verifying tag counts only when its test passed; a requirement with no passing test is <code dir="auto">UNPROVEN_REQ</code>.</p>
|
|
82
|
+
<div class="expressive-code"><figure class="frame is-terminal not-content"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">bun</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">test</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--reporter=junit</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--reporter-outfile=.spec-engine/results.xml</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">spec</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">check</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">.</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--ci</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--results</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">.spec-engine/results.xml</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="bun test --reporter=junit --reporter-outfile=.spec-engine/results.xmlspec check . --ci --results .spec-engine/results.xml"><div></div></button></div></figure></div>
|
|
83
|
+
<div class="sl-heading-wrapper level-h2"><h2 id="governance---base">Governance (<code dir="auto">--base</code>)</h2><a class="sl-anchor-link" href="#governance---base"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “Governance (--base)”</span></a></div>
|
|
84
|
+
<p>Against a git ref, <code dir="auto">check</code> reports an Active requirement deleted without a supersession (<code dir="auto">REQUIREMENT_REMOVED</code>), the last implementing or verifying tag of a surviving requirement removed (<code dir="auto">IMPL_LOST</code>, <code dir="auto">VERIFY_LOST</code>), a deleted <code dir="auto">SPEC.json</code>, and a status flip the domain owner did not approve. These are the same losses <a href="/agent-reference/#spec-guard"><code dir="auto">spec guard</code></a> blocks before a commit.</p>
|
|
85
|
+
<div class="sl-heading-wrapper level-h2"><h2 id="platform-and-glossary">Platform and glossary</h2><a class="sl-anchor-link" href="#platform-and-glossary"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “Platform and glossary”</span></a></div>
|
|
86
|
+
<p>Codes from platform-map report a member missing, unlisted, or mismarked, so its tags are not scanned. The glossary codes report a requirement citing an undefined, superseded, or revised term, and an Active term nothing cites.</p>
|
|
87
|
+
<div class="sl-heading-wrapper level-h2"><h2 id="statement-rules">Statement rules</h2><a class="sl-anchor-link" href="#statement-rules"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “Statement rules”</span></a></div>
|
|
88
|
+
<p><code dir="auto">STATEMENT_RULES</code> reports an Active statement that breaks one of the statement rules in the <a href="/agent-reference/#the-statement-rules">requirement authoring standard</a>. <code dir="auto">spec lint</code> lists the same findings without building the index.</p>
|
|
89
|
+
<div class="sl-heading-wrapper level-h2"><h2 id="regrading-spec-enginecheckjson">Regrading (<code dir="auto">spec-engine/check.json</code>)</h2><a class="sl-anchor-link" href="#regrading-spec-enginecheckjson"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only" data-pagefind-ignore>Section titled “Regrading (spec-engine/check.json)”</span></a></div>
|
|
90
|
+
<p><code dir="auto">check.json</code> raises, lowers, or turns off a code, for the whole platform or for named domains and requirements, and tunes the statement rules. Its schema is in the <a href="/agent-reference/#checkjson">Agent Reference</a>.</p>
|
|
338
91
|
</div><footer class="sl-flex astro-yaxnhex4"><div class="meta sl-flex astro-yaxnhex4"><a href="https://github.com/spec-engine/spec-engine/edit/main/packages/site/src/content/docs/checks.md" class="sl-flex print:hidden astro-uulcuzsf"><svg aria-hidden="true" class="astro-uulcuzsf astro-ica5m7eu" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.2em;"><path d="M22 7.24a1 1 0 0 0-.29-.71l-4.24-4.24a1 1 0 0 0-1.1-.22 1 1 0 0 0-.32.22l-2.83 2.83L2.29 16.05a1 1 0 0 0-.29.71V21a1 1 0 0 0 1 1h4.24a1 1 0 0 0 .76-.29l10.87-10.93L21.71 8c.1-.1.17-.2.22-.33a1 1 0 0 0 0-.24v-.14l.07-.05ZM6.83 20H4v-2.83l9.93-9.93 2.83 2.83L6.83 20ZM18.17 8.66l-2.83-2.83 1.42-1.41 2.82 2.82-1.41 1.42Z"/></svg>Edit page</a></div><div class="pagination-links print:hidden astro-kestnrba" dir="ltr"><a href="/tags/" rel="prev" class="astro-kestnrba"><svg aria-hidden="true" class="astro-kestnrba astro-ica5m7eu" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.5rem;"><path d="M17 11H9.41l3.3-3.29a1.004 1.004 0 1 0-1.42-1.42l-5 5a1 1 0 0 0-.21.33 1 1 0 0 0 0 .76 1 1 0 0 0 .21.33l5 5a1.002 1.002 0 0 0 1.639-.325 1 1 0 0 0-.219-1.095L9.41 13H17a1 1 0 0 0 0-2Z"/></svg><span class="astro-kestnrba">Previous<br class="astro-kestnrba"><span class="link-title astro-kestnrba">Tags</span></span></a><a href="/guides/adoption/" rel="next" class="astro-kestnrba"><svg aria-hidden="true" class="astro-kestnrba astro-ica5m7eu" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.5rem;"><path d="M17.92 11.62a1.001 1.001 0 0 0-.21-.33l-5-5a1.003 1.003 0 1 0-1.42 1.42l3.3 3.29H7a1 1 0 0 0 0 2h7.59l-3.3 3.29a1.002 1.002 0 0 0 .325 1.639 1 1 0 0 0 1.095-.219l5-5a1 1 0 0 0 .21-.33 1 1 0 0 0 0-.76Z"/></svg><span class="astro-kestnrba">Next<br class="astro-kestnrba"><span class="link-title astro-kestnrba">Adoption Guide</span></span></a></div></footer></div></div></main></div></div></div></div></body></html>
|