@infinitedusky/indusk-mcp 1.66.0 → 1.67.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.
Files changed (30) hide show
  1. package/admin/.next/BUILD_ID +1 -1
  2. package/admin/.next/build-manifest.json +3 -3
  3. package/admin/.next/fallback-build-manifest.json +3 -3
  4. package/admin/.next/server/app/_global-error.html +1 -1
  5. package/admin/.next/server/app/_global-error.rsc +1 -1
  6. package/admin/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  7. package/admin/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  8. package/admin/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  9. package/admin/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  10. package/admin/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  11. package/admin/.next/server/middleware-build-manifest.js +3 -3
  12. package/admin/.next/server/pages/500.html +1 -1
  13. package/dist/bin/cli.js +18 -0
  14. package/dist/bin/commands/checks.d.ts +29 -0
  15. package/dist/bin/commands/checks.js +103 -0
  16. package/dist/bin/commands/update.js +4 -0
  17. package/dist/lib/checks/key.d.ts +21 -0
  18. package/dist/lib/checks/key.js +102 -0
  19. package/dist/lib/checks/record.d.ts +18 -0
  20. package/dist/lib/checks/record.js +17 -0
  21. package/dist/lib/checks/steps.d.ts +16 -0
  22. package/dist/lib/checks/steps.js +64 -0
  23. package/dist/lib/config.d.ts +26 -0
  24. package/package.json +2 -2
  25. package/skills/retrospective.md +21 -82
  26. package/skills/verify.md +1 -1
  27. package/skills/work.md +1 -1
  28. /package/admin/.next/static/{q6lhU1Jp2V4gyTd2ln4_A → ucvgwNe7y8LeVmL4xFJY1}/_buildManifest.js +0 -0
  29. /package/admin/.next/static/{q6lhU1Jp2V4gyTd2ln4_A → ucvgwNe7y8LeVmL4xFJY1}/_clientMiddlewareManifest.js +0 -0
  30. /package/admin/.next/static/{q6lhU1Jp2V4gyTd2ln4_A → ucvgwNe7y8LeVmL4xFJY1}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- q6lhU1Jp2V4gyTd2ln4_A
1
+ ucvgwNe7y8LeVmL4xFJY1
@@ -7,9 +7,9 @@
7
7
  "static/chunks/03~yq9q893hmn.js"
8
8
  ],
9
9
  "lowPriorityFiles": [
10
- "static/q6lhU1Jp2V4gyTd2ln4_A/_buildManifest.js",
11
- "static/q6lhU1Jp2V4gyTd2ln4_A/_ssgManifest.js",
12
- "static/q6lhU1Jp2V4gyTd2ln4_A/_clientMiddlewareManifest.js"
10
+ "static/ucvgwNe7y8LeVmL4xFJY1/_buildManifest.js",
11
+ "static/ucvgwNe7y8LeVmL4xFJY1/_ssgManifest.js",
12
+ "static/ucvgwNe7y8LeVmL4xFJY1/_clientMiddlewareManifest.js"
13
13
  ],
14
14
  "rootMainFiles": [
15
15
  "static/chunks/0kl5npeoemmqj.js",
@@ -5,9 +5,9 @@
5
5
  "devFiles": [],
6
6
  "polyfillFiles": [],
7
7
  "lowPriorityFiles": [
8
- "static/q6lhU1Jp2V4gyTd2ln4_A/_buildManifest.js",
9
- "static/q6lhU1Jp2V4gyTd2ln4_A/_ssgManifest.js",
10
- "static/q6lhU1Jp2V4gyTd2ln4_A/_clientMiddlewareManifest.js"
8
+ "static/ucvgwNe7y8LeVmL4xFJY1/_buildManifest.js",
9
+ "static/ucvgwNe7y8LeVmL4xFJY1/_ssgManifest.js",
10
+ "static/ucvgwNe7y8LeVmL4xFJY1/_clientMiddlewareManifest.js"
11
11
  ],
12
12
  "rootMainFiles": []
13
13
  }
@@ -1 +1 @@
1
- <!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/0kl5npeoemmqj.js"/><script src="/_next/static/chunks/11_qr6-odi8db.js" async=""></script><script src="/_next/static/chunks/02p8lah64~lvh.js" async=""></script><script src="/_next/static/chunks/187ewcrb2avxo.js" async=""></script><script src="/_next/static/chunks/0_r.3~d-5z8~_.js" async=""></script><script src="/_next/static/chunks/turbopack-0qbu8l-8inv.o.js" async=""></script><script src="/_next/static/chunks/0.v8w524wvk94.js" async=""></script><script src="/_next/static/chunks/0yelgl0o38y_u.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: This page couldn’t load</title><link rel="icon" href="/favicon.ico?favicon.0x3dzn~oxb6tn.ico" sizes="256x256" type="image/x-icon"/><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/03~yq9q893hmn.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/0kl5npeoemmqj.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[85530,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"default\"]\n3:I[50571,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"default\"]\n4:I[76614,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[76614,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"ViewportBoundary\"]\na:I[76614,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"MetadataBoundary\"]\nc:I[59179,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"default\",1]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"q6lhU1Jp2V4gyTd2ln4_A\"}\n"])</script><script>self.__next_f.push([1,"d:[]\n7:\"$Wd\"\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"e:I[61299,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"IconMark\"]\n6:null\nb:[[\"$\",\"link\",\"0\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0x3dzn~oxb6tn.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$Le\",\"1\",{}]]\n"])</script></body></html>
1
+ <!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/0kl5npeoemmqj.js"/><script src="/_next/static/chunks/11_qr6-odi8db.js" async=""></script><script src="/_next/static/chunks/02p8lah64~lvh.js" async=""></script><script src="/_next/static/chunks/187ewcrb2avxo.js" async=""></script><script src="/_next/static/chunks/0_r.3~d-5z8~_.js" async=""></script><script src="/_next/static/chunks/turbopack-0qbu8l-8inv.o.js" async=""></script><script src="/_next/static/chunks/0.v8w524wvk94.js" async=""></script><script src="/_next/static/chunks/0yelgl0o38y_u.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: This page couldn’t load</title><link rel="icon" href="/favicon.ico?favicon.0x3dzn~oxb6tn.ico" sizes="256x256" type="image/x-icon"/><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/03~yq9q893hmn.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/0kl5npeoemmqj.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[85530,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"default\"]\n3:I[50571,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"default\"]\n4:I[76614,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[76614,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"ViewportBoundary\"]\na:I[76614,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"MetadataBoundary\"]\nc:I[59179,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"default\",1]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"ucvgwNe7y8LeVmL4xFJY1\"}\n"])</script><script>self.__next_f.push([1,"d:[]\n7:\"$Wd\"\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"e:I[61299,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"IconMark\"]\n6:null\nb:[[\"$\",\"link\",\"0\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0x3dzn~oxb6tn.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$Le\",\"1\",{}]]\n"])</script></body></html>
@@ -6,7 +6,7 @@
6
6
  8:I[76614,["/_next/static/chunks/0.v8w524wvk94.js","/_next/static/chunks/0yelgl0o38y_u.js"],"ViewportBoundary"]
7
7
  a:I[76614,["/_next/static/chunks/0.v8w524wvk94.js","/_next/static/chunks/0yelgl0o38y_u.js"],"MetadataBoundary"]
8
8
  c:I[59179,["/_next/static/chunks/0.v8w524wvk94.js","/_next/static/chunks/0yelgl0o38y_u.js"],"default",1]
9
- 0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"q6lhU1Jp2V4gyTd2ln4_A"}
9
+ 0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"ucvgwNe7y8LeVmL4xFJY1"}
10
10
  d:[]
11
11
  7:"$Wd"
12
12
  9:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
@@ -1,5 +1,5 @@
1
1
  1:"$Sreact.fragment"
2
2
  2:I[76614,["/_next/static/chunks/0.v8w524wvk94.js","/_next/static/chunks/0yelgl0o38y_u.js"],"OutletBoundary"]
3
3
  3:"$Sreact.suspense"
4
- 0:{"rsc":["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L2",null,{"children":["$","$3",null,{"name":"Next.MetadataOutlet","children":"$@4"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"q6lhU1Jp2V4gyTd2ln4_A"}
4
+ 0:{"rsc":["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L2",null,{"children":["$","$3",null,{"name":"Next.MetadataOutlet","children":"$@4"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"ucvgwNe7y8LeVmL4xFJY1"}
5
5
  4:null
@@ -6,7 +6,7 @@
6
6
  8:I[76614,["/_next/static/chunks/0.v8w524wvk94.js","/_next/static/chunks/0yelgl0o38y_u.js"],"ViewportBoundary"]
7
7
  a:I[76614,["/_next/static/chunks/0.v8w524wvk94.js","/_next/static/chunks/0yelgl0o38y_u.js"],"MetadataBoundary"]
8
8
  c:I[59179,["/_next/static/chunks/0.v8w524wvk94.js","/_next/static/chunks/0yelgl0o38y_u.js"],"default",1]
9
- 0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"q6lhU1Jp2V4gyTd2ln4_A"}
9
+ 0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"ucvgwNe7y8LeVmL4xFJY1"}
10
10
  d:[]
11
11
  7:"$Wd"
12
12
  9:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
@@ -3,4 +3,4 @@
3
3
  3:I[76614,["/_next/static/chunks/0.v8w524wvk94.js","/_next/static/chunks/0yelgl0o38y_u.js"],"MetadataBoundary"]
4
4
  4:"$Sreact.suspense"
5
5
  5:I[61299,["/_next/static/chunks/0.v8w524wvk94.js","/_next/static/chunks/0yelgl0o38y_u.js"],"IconMark"]
6
- 0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","link","0",{"rel":"icon","href":"/favicon.ico?favicon.0x3dzn~oxb6tn.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L5","1",{}]]}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"q6lhU1Jp2V4gyTd2ln4_A"}
6
+ 0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","link","0",{"rel":"icon","href":"/favicon.ico?favicon.0x3dzn~oxb6tn.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L5","1",{}]]}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"ucvgwNe7y8LeVmL4xFJY1"}
@@ -2,4 +2,4 @@
2
2
  2:I[85530,["/_next/static/chunks/0.v8w524wvk94.js","/_next/static/chunks/0yelgl0o38y_u.js"],"default"]
3
3
  3:I[50571,["/_next/static/chunks/0.v8w524wvk94.js","/_next/static/chunks/0yelgl0o38y_u.js"],"default"]
4
4
  4:[]
5
- 0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"q6lhU1Jp2V4gyTd2ln4_A"}
5
+ 0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"ucvgwNe7y8LeVmL4xFJY1"}
@@ -1 +1 @@
1
- 0:{"tree":{"name":"","param":null,"prefetchHints":0,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}},"staleTime":300,"buildId":"q6lhU1Jp2V4gyTd2ln4_A"}
1
+ 0:{"tree":{"name":"","param":null,"prefetchHints":0,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}},"staleTime":300,"buildId":"ucvgwNe7y8LeVmL4xFJY1"}
@@ -7,9 +7,9 @@ globalThis.__BUILD_MANIFEST = {
7
7
  "static/chunks/03~yq9q893hmn.js"
8
8
  ],
9
9
  "lowPriorityFiles": [
10
- "static/q6lhU1Jp2V4gyTd2ln4_A/_buildManifest.js",
11
- "static/q6lhU1Jp2V4gyTd2ln4_A/_ssgManifest.js",
12
- "static/q6lhU1Jp2V4gyTd2ln4_A/_clientMiddlewareManifest.js"
10
+ "static/ucvgwNe7y8LeVmL4xFJY1/_buildManifest.js",
11
+ "static/ucvgwNe7y8LeVmL4xFJY1/_ssgManifest.js",
12
+ "static/ucvgwNe7y8LeVmL4xFJY1/_clientMiddlewareManifest.js"
13
13
  ],
14
14
  "rootMainFiles": [
15
15
  "static/chunks/0kl5npeoemmqj.js",
@@ -1 +1 @@
1
- <!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/0kl5npeoemmqj.js"/><script src="/_next/static/chunks/11_qr6-odi8db.js" async=""></script><script src="/_next/static/chunks/02p8lah64~lvh.js" async=""></script><script src="/_next/static/chunks/187ewcrb2avxo.js" async=""></script><script src="/_next/static/chunks/0_r.3~d-5z8~_.js" async=""></script><script src="/_next/static/chunks/turbopack-0qbu8l-8inv.o.js" async=""></script><script src="/_next/static/chunks/0.v8w524wvk94.js" async=""></script><script src="/_next/static/chunks/0yelgl0o38y_u.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: This page couldn’t load</title><link rel="icon" href="/favicon.ico?favicon.0x3dzn~oxb6tn.ico" sizes="256x256" type="image/x-icon"/><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/03~yq9q893hmn.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/0kl5npeoemmqj.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[85530,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"default\"]\n3:I[50571,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"default\"]\n4:I[76614,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[76614,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"ViewportBoundary\"]\na:I[76614,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"MetadataBoundary\"]\nc:I[59179,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"default\",1]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"q6lhU1Jp2V4gyTd2ln4_A\"}\n"])</script><script>self.__next_f.push([1,"d:[]\n7:\"$Wd\"\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"e:I[61299,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"IconMark\"]\n6:null\nb:[[\"$\",\"link\",\"0\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0x3dzn~oxb6tn.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$Le\",\"1\",{}]]\n"])</script></body></html>
1
+ <!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/0kl5npeoemmqj.js"/><script src="/_next/static/chunks/11_qr6-odi8db.js" async=""></script><script src="/_next/static/chunks/02p8lah64~lvh.js" async=""></script><script src="/_next/static/chunks/187ewcrb2avxo.js" async=""></script><script src="/_next/static/chunks/0_r.3~d-5z8~_.js" async=""></script><script src="/_next/static/chunks/turbopack-0qbu8l-8inv.o.js" async=""></script><script src="/_next/static/chunks/0.v8w524wvk94.js" async=""></script><script src="/_next/static/chunks/0yelgl0o38y_u.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: This page couldn’t load</title><link rel="icon" href="/favicon.ico?favicon.0x3dzn~oxb6tn.ico" sizes="256x256" type="image/x-icon"/><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/03~yq9q893hmn.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/0kl5npeoemmqj.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[85530,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"default\"]\n3:I[50571,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"default\"]\n4:I[76614,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[76614,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"ViewportBoundary\"]\na:I[76614,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"MetadataBoundary\"]\nc:I[59179,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"default\",1]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"ucvgwNe7y8LeVmL4xFJY1\"}\n"])</script><script>self.__next_f.push([1,"d:[]\n7:\"$Wd\"\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"e:I[61299,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"IconMark\"]\n6:null\nb:[[\"$\",\"link\",\"0\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0x3dzn~oxb6tn.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$Le\",\"1\",{}]]\n"])</script></body></html>
package/dist/bin/cli.js CHANGED
@@ -207,6 +207,24 @@ program
207
207
  await extensionsEnable(root, names);
208
208
  }
209
209
  });
210
+ const checks = program
211
+ .command("checks")
212
+ .description("Run and name the project's declared step tooling (workflow.steps)");
213
+ checks
214
+ .command("show")
215
+ .description("Name what landing and release run for this project, or what is not declared")
216
+ .action(async () => {
217
+ const { checksShow } = await import("./commands/checks.js");
218
+ process.exit(checksShow(process.cwd()));
219
+ });
220
+ checks
221
+ .command("slow")
222
+ .description("Run the declared slow tests and record the code a green run covered")
223
+ .option("--unless-covered", "Skip when a green run already covered this code")
224
+ .action(async (opts) => {
225
+ const { checksSlow } = await import("./commands/checks.js");
226
+ process.exit(checksSlow(process.cwd(), { unlessCovered: opts.unlessCovered === true }));
227
+ });
210
228
  const eval_ = program.command("eval").description("Context evaluation and quality scoring");
211
229
  eval_
212
230
  .command("summary")
@@ -0,0 +1,29 @@
1
+ /**
2
+ * `indusk checks` — a project's declared step tooling, run and named
3
+ * (release-checks-run-once).
4
+ *
5
+ * `indusk checks show` names each step's declared tooling, or says plainly what
6
+ * not declaring it means, so the landing and release steps never assume a
7
+ * project's commands.
8
+ *
9
+ * `indusk checks slow` runs `workflow.steps.land.slow_tests` and, when it
10
+ * exits 0 over a clean tree, records the code it covered in the project's
11
+ * home. `--unless-covered` first looks for a green run that already covered
12
+ * the code at hand and, finding one, says so and runs nothing: release runs
13
+ * the slow tests only when landing's green run does not cover what it ships.
14
+ *
15
+ * A declaration that is not a fact (ADR D5) is refused in one line naming the
16
+ * key, exit 2 — never a stack trace (A13).
17
+ *
18
+ * promise: slow-checks-run-once-per-tree
19
+ */
20
+ export declare function checksSlow(checkout: string, opts: {
21
+ unlessCovered?: boolean;
22
+ }): number;
23
+ /**
24
+ * What landing and release will run for this project, from `workflow.steps`,
25
+ * one line per fact; for each that is not declared, what that means.
26
+ *
27
+ * promise: landing-and-release-name-the-projects-commands
28
+ */
29
+ export declare function checksShow(checkout: string): number;
@@ -0,0 +1,103 @@
1
+ /**
2
+ * `indusk checks` — a project's declared step tooling, run and named
3
+ * (release-checks-run-once).
4
+ *
5
+ * `indusk checks show` names each step's declared tooling, or says plainly what
6
+ * not declaring it means, so the landing and release steps never assume a
7
+ * project's commands.
8
+ *
9
+ * `indusk checks slow` runs `workflow.steps.land.slow_tests` and, when it
10
+ * exits 0 over a clean tree, records the code it covered in the project's
11
+ * home. `--unless-covered` first looks for a green run that already covered
12
+ * the code at hand and, finding one, says so and runs nothing: release runs
13
+ * the slow tests only when landing's green run does not cover what it ships.
14
+ *
15
+ * A declaration that is not a fact (ADR D5) is refused in one line naming the
16
+ * key, exit 2 — never a stack trace (A13).
17
+ *
18
+ * promise: slow-checks-run-once-per-tree
19
+ */
20
+ import { spawnSync } from "node:child_process";
21
+ import { gitSync } from "../../lib/bookkeeping/git.js";
22
+ import { codeKey, whyNoKey } from "../../lib/checks/key.js";
23
+ import { findCoveringRun, recordGreenRun } from "../../lib/checks/record.js";
24
+ import { readWorkflowSteps } from "../../lib/checks/steps.js";
25
+ export function checksSlow(checkout, opts) {
26
+ const steps = declared(checkout);
27
+ if (steps === null)
28
+ return 2;
29
+ const command = steps.land?.slow_tests;
30
+ if (!command) {
31
+ console.info("No slow tests are declared (workflow.steps.land.slow_tests in .indusk/config.json): nothing to run.");
32
+ return 0;
33
+ }
34
+ const top = gitSync(checkout, "rev-parse", "--show-toplevel");
35
+ const root = top.code === 0 ? top.out : checkout;
36
+ const before = codeKey(root, steps);
37
+ if (opts.unlessCovered) {
38
+ const covering = before ? findCoveringRun(root, before) : null;
39
+ if (covering) {
40
+ console.info(`slow tests skipped: covered by the green run at ${covering.at} (${covering.cwd}) of \`${covering.command}\`.`);
41
+ return 0;
42
+ }
43
+ console.info(before
44
+ ? "slow tests: no green run covers this code."
45
+ : `slow tests: ${whyNoKey(root, steps)}.`);
46
+ }
47
+ const at = new Date().toISOString();
48
+ const run = spawnSync("sh", ["-c", command], { cwd: root, stdio: "inherit" });
49
+ const code = run.status ?? 1;
50
+ if (code !== 0)
51
+ return code;
52
+ const after = codeKey(root, steps);
53
+ if (before && after === before) {
54
+ recordGreenRun(root, { key: before, at, command, cwd: root });
55
+ console.info("slow tests green: recorded for this code.");
56
+ }
57
+ else {
58
+ console.info(`slow tests green, but not recorded: ${whyNoKey(root, steps) ?? "covered files changed during the run"}.`);
59
+ }
60
+ return 0;
61
+ }
62
+ /**
63
+ * What landing and release will run for this project, from `workflow.steps`,
64
+ * one line per fact; for each that is not declared, what that means.
65
+ *
66
+ * promise: landing-and-release-name-the-projects-commands
67
+ */
68
+ export function checksShow(checkout) {
69
+ const steps = declared(checkout);
70
+ if (steps === null)
71
+ return 2;
72
+ const land = steps.land ?? {};
73
+ const release = steps.release ?? {};
74
+ const lines = [
75
+ "Landing",
76
+ land.slow_tests
77
+ ? ` slow tests: ${land.slow_tests} (run by indusk checks slow; release skips them when a green run covered the same code)`
78
+ : " slow tests: none declared — landing runs no slow tests (workflow.steps.land.slow_tests)",
79
+ "Release",
80
+ release.command
81
+ ? ` command: ${release.command}`
82
+ : " command: none declared — nothing to publish; the plan closes at landing (workflow.steps.release.command)",
83
+ release.version_file
84
+ ? ` version file: ${release.version_file}`
85
+ : " version file: none declared — no version to bump (workflow.steps.release.version_file)",
86
+ release.changelog
87
+ ? ` changelog: ${release.changelog}`
88
+ : " changelog: none declared — no changelog to roll (workflow.steps.release.changelog)",
89
+ ` slow tests cover: ${release.covers?.length ? release.covers.join(", ") : "the whole repository but .indusk/"}`,
90
+ ];
91
+ console.info(lines.join("\n"));
92
+ return 0;
93
+ }
94
+ /** The declared steps, or `null` after one line on stderr naming what was refused. */
95
+ function declared(checkout) {
96
+ try {
97
+ return readWorkflowSteps(checkout);
98
+ }
99
+ catch (err) {
100
+ console.error(err instanceof Error ? err.message : String(err));
101
+ return null;
102
+ }
103
+ }
@@ -758,6 +758,10 @@ export async function update(projectRoot) {
758
758
  // key is always present; domains are decided in planning and declared here.
759
759
  const { ensurePromisesConfig } = await import("../../lib/promises/config.js");
760
760
  reportEnsured(ensurePromisesConfig(projectRoot), "promises.domains: [] to .indusk/config.json", "promises.domains (already set)");
761
+ // [Workflow — release-checks-run-once] scaffold workflow.steps, empty, so a
762
+ // project sees where it names its slow tests and release (indusk checks show).
763
+ const { ensureWorkflowConfig } = await import("../../lib/checks/steps.js");
764
+ reportEnsured(ensureWorkflowConfig(projectRoot), "workflow.steps: {} to .indusk/config.json", "workflow.steps (already set)");
761
765
  // [Decay — indusk-makeover] scaffold sweep + dead-draft keys idempotently.
762
766
  // Presence-keyed; user-customized values never clobbered. Readers default
763
767
  // regardless, so absence is never "disabled".
@@ -0,0 +1,21 @@
1
+ import type { WorkflowSteps } from "../config.js";
2
+ /**
3
+ * The code a slow run covers, as one key (release-checks-run-once D3): for each
4
+ * tracked file under `release.covers` (absent: the whole repository but
5
+ * `.indusk/`), its path, its mode and the hash of its content, sha256 over the
6
+ * sorted lines. Content, never the commit: the bump is a commit of its own, so
7
+ * a key on the commit would never match. The changelog is left out, and the
8
+ * version file is read without its `version`, so the bump and its changelog
9
+ * entry are not a change.
10
+ *
11
+ * `null` when there is no honest key: a covered file has an uncommitted
12
+ * change, an untracked file sits among them, or `covers` names something that
13
+ * lists no tracked file (A11 — a typo there would otherwise key nothing, and a
14
+ * key over nothing is covered by every run). A run with no key is never
15
+ * recorded and never trusted; `whyNoKey` says which it was.
16
+ *
17
+ * promise: slow-checks-run-once-per-tree
18
+ */
19
+ export declare function codeKey(checkout: string, steps: WorkflowSteps): string | null;
20
+ /** Why `codeKey` would give no key for this checkout, or `null` when it would give one. */
21
+ export declare function whyNoKey(checkout: string, steps: WorkflowSteps): string | null;
@@ -0,0 +1,102 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFileSync } from "node:fs";
3
+ import { join, posix } from "node:path";
4
+ import { gitSync } from "../bookkeeping/git.js";
5
+ /**
6
+ * The code a slow run covers, as one key (release-checks-run-once D3): for each
7
+ * tracked file under `release.covers` (absent: the whole repository but
8
+ * `.indusk/`), its path, its mode and the hash of its content, sha256 over the
9
+ * sorted lines. Content, never the commit: the bump is a commit of its own, so
10
+ * a key on the commit would never match. The changelog is left out, and the
11
+ * version file is read without its `version`, so the bump and its changelog
12
+ * entry are not a change.
13
+ *
14
+ * `null` when there is no honest key: a covered file has an uncommitted
15
+ * change, an untracked file sits among them, or `covers` names something that
16
+ * lists no tracked file (A11 — a typo there would otherwise key nothing, and a
17
+ * key over nothing is covered by every run). A run with no key is never
18
+ * recorded and never trusted; `whyNoKey` says which it was.
19
+ *
20
+ * promise: slow-checks-run-once-per-tree
21
+ */
22
+ export function codeKey(checkout, steps) {
23
+ const root = topLevel(checkout);
24
+ if (!root || whyNoKey(root, steps))
25
+ return null;
26
+ const { covers, counted, versionFile } = coverage(steps);
27
+ const listed = gitSync(root, "ls-files", "-s", "-z", "--", ...covers);
28
+ if (listed.code !== 0)
29
+ return null;
30
+ const lines = [];
31
+ for (const entry of listed.out.split("\0").filter(Boolean)) {
32
+ // `<mode> <blob> <stage>\t<path>`
33
+ const tab = entry.indexOf("\t");
34
+ const path = entry.slice(tab + 1);
35
+ if (!counted(path))
36
+ continue;
37
+ const [mode, blob] = entry.slice(0, tab).split(" ");
38
+ const content = path === versionFile ? withoutVersion(join(root, path)) : blob;
39
+ lines.push(`${path}\0${mode} ${content}`);
40
+ }
41
+ lines.sort();
42
+ return createHash("sha256").update(lines.join("\n")).digest("hex");
43
+ }
44
+ /** Why `codeKey` would give no key for this checkout, or `null` when it would give one. */
45
+ export function whyNoKey(checkout, steps) {
46
+ const root = topLevel(checkout);
47
+ if (!root)
48
+ return `${checkout} is not a git checkout`;
49
+ const { covers, counted, declared } = coverage(steps);
50
+ if (declared && covers.length === 0)
51
+ return "workflow.steps.release.covers is an empty list";
52
+ for (const entry of declared ? covers : []) {
53
+ const files = gitSync(root, "ls-files", "-z", "--", entry);
54
+ if (files.code !== 0 || files.out === "") {
55
+ return `workflow.steps.release.covers names no tracked file: ${entry}`;
56
+ }
57
+ }
58
+ const changed = gitSync(root, "diff", "--name-only", "HEAD", "--", ...covers);
59
+ const untracked = gitSync(root, "ls-files", "--others", "--exclude-standard", "--", ...covers);
60
+ if (changed.code !== 0 || untracked.code !== 0)
61
+ return "git could not read the checkout";
62
+ const dirty = `${changed.out}\n${untracked.out}`.split("\n").filter(Boolean).filter(counted);
63
+ if (dirty.length > 0)
64
+ return `covered files have uncommitted changes: ${dirty.slice(0, 3).join(", ")}`;
65
+ return null;
66
+ }
67
+ function topLevel(checkout) {
68
+ const top = gitSync(checkout, "rev-parse", "--show-toplevel");
69
+ return top.code === 0 ? top.out : null;
70
+ }
71
+ /** The declared paths, normalised the way git lists them, and which listed paths count. */
72
+ function coverage(steps) {
73
+ const release = steps.release ?? {};
74
+ const declared = release.covers !== undefined;
75
+ const covers = declared ? (release.covers ?? []).map(normalise) : ["."];
76
+ const changelog = release.changelog ? normalise(release.changelog) : undefined;
77
+ const versionFile = release.version_file ? normalise(release.version_file) : undefined;
78
+ const counted = (path) => !path.startsWith(".indusk/") && path !== changelog;
79
+ return { declared, covers, counted, versionFile };
80
+ }
81
+ /**
82
+ * `./apps/x/`, `apps//x` and `apps/x` are one path, as `git ls-files` prints
83
+ * it. `normalize` collapses the separators, so at most one trailing slash is
84
+ * left; a path's rule, written here, not the Jaeger URL's (A29 pins that one).
85
+ */
86
+ function normalise(path) {
87
+ return posix.normalize(path).replace(/^\.\//, "").replace(/\/$/, "");
88
+ }
89
+ /** The version file's content hash with its `version` taken out: a JSON field, or the first `version` line. */
90
+ function withoutVersion(path) {
91
+ const text = readFileSync(path, "utf-8");
92
+ let rest;
93
+ try {
94
+ const parsed = JSON.parse(text);
95
+ delete parsed.version;
96
+ rest = JSON.stringify(parsed);
97
+ }
98
+ catch {
99
+ rest = text.replace(/^\s*version\s*[=:].*$/m, "");
100
+ }
101
+ return createHash("sha256").update(rest).digest("hex");
102
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * The record of green slow runs (release-checks-run-once D1–D2), in the
3
+ * project's home: the same file from the main checkout and every worktree, so
4
+ * a run recorded at landing in a plan's worktree is found by the release on
5
+ * `main`. Per machine by design — a run on another machine is not evidence
6
+ * here. Only fully green runs over a clean tree are ever written.
7
+ *
8
+ * promise: slow-checks-run-once-per-tree
9
+ */
10
+ export interface GreenRun {
11
+ key: string;
12
+ at: string;
13
+ command: string;
14
+ cwd: string;
15
+ }
16
+ export declare function recordGreenRun(anyCheckout: string, run: GreenRun): void;
17
+ /** The latest green run that covered `key`, or `null`. */
18
+ export declare function findCoveringRun(anyCheckout: string, key: string): GreenRun | null;
@@ -0,0 +1,17 @@
1
+ import { appendFileSync, mkdirSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { readJsonl } from "../bookkeeping/jsonl.js";
4
+ import { bookkeepingRoots } from "../bookkeeping/roots.js";
5
+ function recordPath(anyCheckout) {
6
+ return join(bookkeepingRoots(anyCheckout).home, "slow-runs.jsonl");
7
+ }
8
+ export function recordGreenRun(anyCheckout, run) {
9
+ const path = recordPath(anyCheckout);
10
+ mkdirSync(bookkeepingRoots(anyCheckout).home, { recursive: true });
11
+ appendFileSync(path, `${JSON.stringify(run)}\n`);
12
+ }
13
+ /** The latest green run that covered `key`, or `null`. */
14
+ export function findCoveringRun(anyCheckout, key) {
15
+ const runs = readJsonl(recordPath(anyCheckout)).filter((r) => r.key === key && typeof r.at === "string" && typeof r.cwd === "string");
16
+ return runs.at(-1) ?? null;
17
+ }
@@ -0,0 +1,16 @@
1
+ import { type EnsureResult, type WorkflowSteps } from "../config.js";
2
+ /**
3
+ * A project's declared step tooling, `workflow.steps` (release-checks-run-once
4
+ * D4). Facts, never logic (D5): a command or a path is a string, `covers` a
5
+ * list of strings; anything else is refused naming the key, so a value nobody
6
+ * can read is never quietly treated as "not declared".
7
+ *
8
+ * promise: landing-and-release-name-the-projects-commands
9
+ */
10
+ export declare function readWorkflowSteps(checkout: string): WorkflowSteps;
11
+ /**
12
+ * Ensure the `workflow` block exists, empty: keyed on presence, so a project
13
+ * that declares its steps is never touched, and one that declares none still
14
+ * sees where they would go. Called by `indusk update`.
15
+ */
16
+ export declare function ensureWorkflowConfig(projectRoot: string): EnsureResult;
@@ -0,0 +1,64 @@
1
+ import { ensureConfigBlock, readConfig } from "../config.js";
2
+ /**
3
+ * A project's declared step tooling, `workflow.steps` (release-checks-run-once
4
+ * D4). Facts, never logic (D5): a command or a path is a string, `covers` a
5
+ * list of strings; anything else is refused naming the key, so a value nobody
6
+ * can read is never quietly treated as "not declared".
7
+ *
8
+ * promise: landing-and-release-name-the-projects-commands
9
+ */
10
+ export function readWorkflowSteps(checkout) {
11
+ const steps = readConfig(checkout)?.workflow
12
+ ?.steps;
13
+ if (steps === undefined)
14
+ return {};
15
+ if (!isObject(steps))
16
+ throw new Error("workflow.steps must be an object of steps");
17
+ const out = {};
18
+ if (steps.land !== undefined) {
19
+ const land = section(steps.land, "land");
20
+ out.land = { slow_tests: text(land.slow_tests, "land.slow_tests") };
21
+ }
22
+ if (steps.release !== undefined) {
23
+ const release = section(steps.release, "release");
24
+ out.release = {
25
+ command: text(release.command, "release.command"),
26
+ version_file: text(release.version_file, "release.version_file"),
27
+ changelog: text(release.changelog, "release.changelog"),
28
+ covers: paths(release.covers, "release.covers"),
29
+ };
30
+ }
31
+ return out;
32
+ }
33
+ function isObject(v) {
34
+ return typeof v === "object" && v !== null && !Array.isArray(v);
35
+ }
36
+ function section(v, key) {
37
+ if (!isObject(v))
38
+ throw new Error(`workflow.steps.${key} must be an object`);
39
+ return v;
40
+ }
41
+ function text(v, key) {
42
+ if (v === undefined)
43
+ return undefined;
44
+ if (typeof v !== "string" || v.trim() === "") {
45
+ throw new Error(`workflow.steps.${key} must be a command, a path or a name (a non-empty string); a step that needs logic names a script that holds it`);
46
+ }
47
+ return v;
48
+ }
49
+ function paths(v, key) {
50
+ if (v === undefined)
51
+ return undefined;
52
+ if (!Array.isArray(v) || !v.every((p) => typeof p === "string" && p.trim() !== "")) {
53
+ throw new Error(`workflow.steps.${key} must be a list of paths`);
54
+ }
55
+ return v;
56
+ }
57
+ /**
58
+ * Ensure the `workflow` block exists, empty: keyed on presence, so a project
59
+ * that declares its steps is never touched, and one that declares none still
60
+ * sees where they would go. Called by `indusk update`.
61
+ */
62
+ export function ensureWorkflowConfig(projectRoot) {
63
+ return ensureConfigBlock(projectRoot, "workflow", { steps: {} });
64
+ }
@@ -19,8 +19,34 @@ export interface VerifyToolConfig {
19
19
  tool: string;
20
20
  config: string;
21
21
  }
22
+ /**
23
+ * What each workflow step runs (release-checks-run-once, ADR D4–D5): the
24
+ * project's own tooling, named. Facts, never logic: every value is a command,
25
+ * a path or a name — no conditions, templating or expressions; a project that
26
+ * needs one writes a script it owns and names it here. Shaped for every step,
27
+ * though only landing's slow tests and release are read today.
28
+ */
29
+ export interface WorkflowSteps {
30
+ land?: {
31
+ /** The slow tests, run once per piece of code (`indusk checks slow`). */
32
+ slow_tests?: string;
33
+ };
34
+ release?: {
35
+ /** The command that publishes or deploys. */
36
+ command?: string;
37
+ /** The file whose `version` the bump changes; read without it when keying the code. */
38
+ version_file?: string;
39
+ /** The changelog; left out when keying the code. */
40
+ changelog?: string;
41
+ /** What the slow tests cover; absent = the whole repository but `.indusk/`. */
42
+ covers?: string[];
43
+ };
44
+ }
22
45
  export interface InduskConfig {
23
46
  mode: "full" | "local";
47
+ workflow?: {
48
+ steps?: WorkflowSteps;
49
+ };
24
50
  verify: {
25
51
  linter?: VerifyToolConfig;
26
52
  testRunner?: VerifyToolConfig;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@infinitedusky/indusk-mcp",
3
- "version": "1.66.0",
3
+ "version": "1.67.0",
4
4
  "description": "InDusk development system — skills, MCP tools, and CLI for structured AI-assisted development",
5
5
  "type": "module",
6
6
  "files": [
@@ -209,6 +209,6 @@
209
209
  "test": "vitest run",
210
210
  "e2e": "vitest run --config vitest.e2e.config.ts",
211
211
  "test:system": "pnpm run prepublishOnly && node scripts/with-daemon-guard.js vitest run --config vitest.system.config.ts",
212
- "release": "bash scripts/release-guard.sh && pnpm -w test:system && npm whoami && npm_config_loglevel=warn pnpm publish --no-git-checks && node scripts/record-release.js"
212
+ "release": "bash scripts/release-guard.sh && npm whoami && npm_config_loglevel=warn pnpm publish --no-git-checks && node scripts/record-release.js"
213
213
  }
214
214
  }
@@ -318,109 +318,48 @@ Update `.indusk/current.md`'s Project (shared) region: the plan leaves the in-fl
318
318
 
319
319
  ### Step 10: Land — the branch reaches main, and is gone
320
320
 
321
- Archival is the branch's last write. Worktree-per-plan opened a branch at Phase 1, and **a plan is not closed until that branch is on `main` and deleted**. Nothing before this step puts the archive, the docs pages or the code on trunk; the retrospective's own commits sit on the branch until someone merges. The cost of leaving this to memory is on the record: three plans shipped in July on branches nobody merged and their code was later dropped as superseded (root `master.md`, sequence reconciliation); `workbench-trust-fixes` closed and sat "awaits merge" in its master; a publish went out 56 seconds before a twelve-commit plan branch merged, which is why `pnpm release` now refuses unmerged packaged branches.
321
+ Archival is the branch's last write. Worktree-per-plan opened a branch at Phase 1, and **a plan is not closed until that branch is on `main` and deleted**. Nothing before this step puts the archive, the docs pages or the code on trunk; the retrospective's own commits sit on the branch until someone merges. The cost of leaving this to memory is on the record: plans have shipped on branches nobody merged, had their code dropped as superseded, and once a publish went out a minute before a plan branch merged.
322
+
323
+ **What this project runs is its own.** Before anything below, run `indusk checks show`: it names the project's slow tests, its release command, its version file and its changelog, from `workflow.steps` in `.indusk/config.json`, or says plainly that one is not declared and what that means. Use only what it names. A project that declares no slow tests runs none at landing; one that declares no release command has nothing to publish, and the plan closes at this step.
322
324
 
323
325
  Do it in this order, all from the plan's worktree until the merge itself:
324
326
 
325
327
  1. **Confirm the branch is clean and closed** — `git status --short` empty; Steps 0–9 done (the archive folder is committed on the branch).
326
- 2. **Integrate trunk into the branch** — `git fetch origin && git merge main` (or `origin/main`) *in the worktree*, and resolve what conflicts once. Do not rebase a plan branch: a rebase replays every commit and re-asks the same append-only-ledger conflict (`highlights-processed.jsonl`, `current.md`) on each of them — the first attempt at this step aborted a 112-commit rebase on its first replayed commit. Then run the whole of both tiers, `pnpm test` and `pnpm test:system` — landing is when the `contract` tests run, since phases run only what they touched; a green branch before the merge says nothing about the branch after it. A ledger that conflicts here is missing its `merge=union` line in `.gitattributes` — add it in the same commit that resolves the conflict.
328
+ 2. **Integrate trunk into the branch** — `git fetch origin && git merge main` (or `origin/main`) *in the worktree*, and resolve what conflicts once. Do not rebase a plan branch: a rebase replays every commit and re-asks the same append-only-ledger conflict on each of them. Then run the project's everyday tests and, if it declares slow tests, `indusk checks slow` — landing is when the slow tier runs, since phases run only what they touched; a green branch before the merge says nothing about the branch after it. `indusk checks slow` records a fully green run on a clean tree, so the release on the same code does not run it again. A ledger that conflicts here is missing its `merge=union` line in `.gitattributes` — add it in the same commit that resolves the conflict.
327
329
  3. **Check trunk's working tree on every path the branch touches** — `git -C <trunk> status --short`. A merge is refused when trunk has uncommitted changes on a file the branch also changed (`.indusk/planning/master.md` and `.indusk/current.md` are the usual ones — every plan writes both). Those changes belong to whoever made them: if `indusk agent list` shows another live session on trunk, **ask** — never commit, stash or discard another session's work to clear your own path. A bare `git stash` on a shared stack is off the table regardless (see the git skill).
328
330
  4. **Land** — `indusk plans land {plan-name}`. It refuses a plan that has not been accepted (`indusk plans accept {plan-name}`, Accept in the admin, or a project set to `release.auto_accept`), naming it: a plan's build reaches `main` only once someone, or its workflow, has accepted it. It then merges `main` into the branch, runs `plans.land_checks` from `.indusk/config.json`, merges the branch into `main` with `--no-ff`, releases the assignment, removes the worktree and deletes the branch — and refuses, with nothing done, when the trunk has uncommitted changes on a path the branch touches (step 3). With reviewers instead: push and open the PR, merge it, pull trunk, then `indusk worktree release {plan-name}`, `git worktree remove <worktree-path>` and `git branch -d plan/{plan-name}`.
329
- 5. **Delete the remote branch** if it was pushed — `git push origin --delete plan/{plan-name}`. A worktree left behind is a stale `.next/` lock, a stale `dist/`, and a `⚠ collision` in the next `indusk agent list`.
330
- 6. **Verify on trunk** — `git for-each-ref refs/heads/plan/* --no-merged HEAD` no longer lists the plan; `.indusk/planning/archive/{plan-name}/` exists on trunk; `indusk context check-pointers` passes there too (CLAUDE.md pointers were written on the branch and are only now on trunk); the full suites green once on trunk if the rebase in step 2 was not a fast-forward.
331
+ 5. **Delete the remote branch** if it was pushed — `git push origin --delete plan/{plan-name}`. A worktree left behind is a stale build lock, a stale build output, and a `⚠ collision` in the next `indusk agent list`.
332
+ 6. **Verify on trunk** — `git for-each-ref refs/heads/plan/* --no-merged HEAD` no longer lists the plan; `.indusk/planning/archive/{plan-name}/` exists on trunk; `indusk context check-pointers` passes there too (CLAUDE.md pointers were written on the branch and are only now on trunk).
331
333
  7. **Record the landing** — append one line to the archived `retrospective.md` on trunk: `Landed on main at <sha>, <date>.` Commit it on trunk. That line is what distinguishes a closed plan from a merged one when the two are read months later.
332
334
 
333
- **The bump is Step 11, not a thing to remember.** It happens on trunk, immediately after this step, because that is where the guard's own rule points. Publishing itself stays the operator's call.
335
+ **The bump is Step 11, not a thing to remember.** It happens on trunk, immediately after this step. Publishing itself stays the operator's call.
334
336
 
335
337
  ### Step 11: Bump — the version that describes this tree
336
338
 
337
- The release guard's rule is *bump on main, after the branch is merged*. Step 10
338
- just merged and is standing on main. This is that moment, and it is the only
339
- one that knows what shipped — so the bump belongs here, not to whoever next
340
- tries to publish and has to reconstruct it.
341
-
342
- Before this step existed, "bump" meant three manual acts every time — edit
343
- `package.json`, roll the changelog heading, write a commit message in the exact
344
- format the guard greps for — each silently wrong-able, with no command behind
345
- them. Publishing 1.54.0 took five attempts and none of them failed for the
346
- reason its error message gave.
347
-
348
- **First, is there anything to release?** The question is what packaged files
349
- changed **since the release commit** — not what the last commit changed. Step
350
- 10 ends by committing the landing note on trunk, so the last commit is always
351
- that note, and asking it would read "nothing to release" for every plan.
352
-
353
- Read the `indusk/version` line of `check_health`, which answers exactly this:
354
- `release commit <sha> for X.Y.Z, N packaged commit(s) since`. Or ask git
355
- directly, `git -C <trunk> diff --name-only <release-commit>..HEAD -- <paths>`,
356
- with `<paths>` taken from `PACKAGED_PATHS` in
357
- `apps/indusk-mcp/scripts/release-guard.sh` — read it there rather than from
358
- memory: that list is what the guard refuses on, and a copy of it kept anywhere
359
- else drifts.
360
-
361
- This counts every plan that landed since the last release, not only this one —
362
- which is right: the bump describes the tree.
363
-
364
- If it names nothing, **say so and stop**: *"No packaged paths changed — nothing
365
- to release; the version stays at X.Y.Z."* Record that in the retrospective. A
366
- plan that touched only plan documents, docs pages or this repository's own
367
- skills changes no tarball, and bumping for it ships a version number that
368
- describes nothing. **Skipping is a finding, not an absence** — write it down,
369
- or the next reader cannot tell it from the step never having run.
370
-
371
- **If it did change packaged paths, choose the increment.** You have just
372
- written the retrospective, so you know which this is:
373
-
374
- - **minor** — the plan added a capability someone can now use: a command, a
375
- tool, a config key, a behaviour that did not exist.
376
- - **patch** — the plan fixed, hardened or refactored something already shipped.
377
-
378
- When a plan genuinely did both, it is a minor. When you cannot tell, it is a
379
- minor — under-describing a release is the cheaper error, because a consumer who
380
- expected a fix and got a feature loses nothing.
339
+ A project that declares no release command (`indusk checks show` says "nothing to publish") has nothing to bump: **say so, record it in the retrospective, and stop.** Skipping is a finding, not an absence.
381
340
 
382
- **Then, three writes and one commit:**
341
+ Otherwise: bump on main, after the branch is merged. Step 10 just merged and is standing on main. This is that moment, and it is the only one that knows what shipped.
383
342
 
384
- 1. **The changelog.** `apps/docs/src/changelog.md` opens with `## [Unreleased]`
385
- holding the entries this plan (and any plan that landed since the last
386
- release) already wrote. Roll it: leave `## [Unreleased]` empty at the top
387
- and insert `## [X.Y.Z] — <today>` beneath it, so the entries now sit under
388
- the version that carries them.
389
- 2. **The version.** `apps/indusk-mcp/package.json`'s `version`, and nothing
390
- else — the platform-split telemetry packages carry their own.
391
- 3. **The commit**, on trunk, whose *first line* must begin exactly
392
- `chore(release): X.Y.Z` — `release-guard.sh` finds the release commit by
393
- grepping for it, and `trunk-guard.js` exempts it from the no-code-on-trunk
394
- rule by reading it.
343
+ **First, is there anything to release?** The question is what the release covers that changed **since the last release commit** (the last commit whose message begins `chore(release):`) — not what the last commit changed. Step 10 ends by committing the landing note on trunk, so the last commit is always that note. Ask git: `git -C <trunk> diff --name-only <release-commit>..HEAD -- <covered paths>`, the covered paths being what `indusk checks show` lists under "slow tests cover". This counts every plan that landed since the last release, not only this one — which is right: the bump describes the tree.
395
344
 
396
- Pass the message as a **literal `-m`**, or with `-F <file>`. Both are read.
397
- A message built by a heredoc or `$(…)` is *not* read — the hook says so and
398
- refuses rather than guessing, because it does not run a shell.
345
+ If it names nothing, **say so and stop**: *"Nothing the release covers changed — the version stays at X.Y.Z."* Record that in the retrospective.
399
346
 
400
- ```bash
401
- git -C <trunk> add apps/indusk-mcp/package.json apps/docs/src/changelog.md
402
- git -C <trunk> commit -m "chore(release): X.Y.Z — <what shipped, in the plan's own words>" \
403
- -m "<the why, as many -m paragraphs as it deserves>"
404
- ```
347
+ **If it did, choose the increment.** You have just written the retrospective, so you know which this is:
405
348
 
406
- **Then stop.** Running `pnpm release` is the operator's decision and needs a
407
- one-time password an agent cannot enter. Say that the bump is committed and the
408
- tree is ready, and let them choose whether to publish now or let the next plan
409
- accumulate into the same version.
349
+ - **minor** — the plan added a capability someone can now use: a command, a tool, a config key, a behaviour that did not exist.
350
+ - **patch** — the plan fixed, hardened or refactored something already shipped.
410
351
 
411
- **Verify before you hand over**, so the guard's refusals are not the first
412
- thing they see:
352
+ When a plan genuinely did both, it is a minor. When you cannot tell, it is a minor — under-describing a release is the cheaper error.
413
353
 
414
- ```bash
415
- bash apps/indusk-mcp/scripts/release-guard.sh
416
- ```
354
+ **Then, the writes and one commit**, using the files `indusk checks show` names:
417
355
 
418
- It should print that HEAD is the release commit, packaged paths are clean, no
419
- unmerged packaged work remains, and every declared dependency is installed. If
420
- it refuses, fix what it names — a refusal here is cheap; the same refusal after
421
- `npm login` is not.
356
+ 1. **The changelog**, if one is declared. It opens with `## [Unreleased]` holding the entries this plan (and any plan that landed since the last release) already wrote. Roll it: leave `## [Unreleased]` empty at the top and insert `## [X.Y.Z] — <today>` beneath it.
357
+ 2. **The version**, in the declared version file, and nothing else.
358
+ 3. **The commit**, on trunk, whose *first line* begins exactly `chore(release): X.Y.Z` — release checks find the release commit by it, and `trunk-guard.js` exempts it from the no-code-on-trunk rule by reading it. Pass the message as a **literal `-m`**, or with `-F <file>`; a message built by a heredoc or `$(…)` is *not* read.
422
359
 
360
+ If trunk-guard refuses editing the version file or the changelog on trunk, make the two edits on a short release branch, commit `chore(release): X.Y.Z` there, and fast-forward trunk to it, so trunk's HEAD is the release commit. Never route around the refusal with a shell write.
423
361
 
362
+ **Then stop.** Running the release command is the operator's decision, and a publish usually needs a credential an agent cannot enter. Say that the bump is committed and the tree is ready. Before handing over, run `indusk checks slow --unless-covered`: it should say the slow tests are covered by landing's green run. If it runs them instead, something the release covers changed since landing — say so before the operator finds out the slow way. If the project's release command begins with its own guard script, run that guard alone too, so its refusals are not the first thing the operator sees.
424
363
 
425
364
  ## Important
426
365
 
package/skills/verify.md CHANGED
@@ -148,7 +148,7 @@ Explicit commands in impl verification sections override auto-discovery. If an i
148
148
  | Lint | `pnpm check` | Any source file change |
149
149
  | Test (scoped) | `pnpm turbo test --filter={app}` | Any logic change |
150
150
  | Test (related) | `pnpm exec vitest related <changed files>` | Any phase: the tests that import what the phase changed |
151
- | Test (all) | `pnpm test` + `pnpm test:system` | At landing and on release — never as a phase's default (test-kinds) |
151
+ | Test (all) | the everyday tests + `indusk checks slow` (the slow tests `indusk checks show` names) | At landing; release skips a slow run landing already covered — never as a phase's default (test-kinds) |
152
152
  | Build (scoped) | `pnpm turbo build --filter={app}` | Shared package or build config changes |
153
153
  | Auto-discover | `quality_check` with mode `discover` | See what checks are available |
154
154
  | Run all checks | `quality_check` with no args | Run all discovered checks at once |
package/skills/work.md CHANGED
@@ -270,7 +270,7 @@ The hook validates that both `asked:` and `user:` are present with non-empty quo
270
270
 
271
271
  11. **Verification items.** The Verification section requires proof, not assumption. See the verify skill for full guidance.
272
272
  - Run checks in order: type check → lint → affected tests → build. Skip checks that don't apply (see verify skill's skip logic table).
273
- - **A phase runs what it touched, not the suite**: the test files its own trajectory rows name, plus `pnpm exec vitest related <files this phase changed>` in each package it changed. Seconds, not minutes. The full `pnpm test` and `pnpm test:system` run at **landing** (the retrospective's merge step) and on release — the moment for `contract` tests, which is what the system tier holds.
273
+ - **A phase runs what it touched, not the suite**: the test files its own trajectory rows name, plus `pnpm exec vitest related <files this phase changed>` in each package it changed. Seconds, not minutes. The full everyday suite and the project's slow tests (`indusk checks slow`, the command `indusk checks show` names) run at **landing** (the retrospective's merge step) — the moment for `contract` tests, which is what the slow tier holds; release skips a slow run landing already covered.
274
274
  - Run commands and capture output — verification items must be specific runnable commands, not "verify it works"
275
275
  - If a check fails: read the error, fix it, re-run only the failing check. Max 3 attempts before flagging as a blocker to the user.
276
276
  - Check items off only when actually verified, not assumed