vibebusiness 1.2.86 → 1.2.87

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 (85) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +29 -29
  3. package/.next/standalone/.next/app-path-routes-manifest.json +1 -1
  4. package/.next/standalone/.next/build-manifest.json +2 -2
  5. package/.next/standalone/.next/prerender-manifest.json +1 -1
  6. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  7. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  8. package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
  9. package/.next/standalone/.next/server/app/api/analyze/route.js.nft.json +1 -1
  10. package/.next/standalone/.next/server/app/api/config/route.js.nft.json +1 -1
  11. package/.next/standalone/.next/server/app/api/epics/[id]/ideas/route.js.nft.json +1 -1
  12. package/.next/standalone/.next/server/app/api/epics/[id]/route.js.nft.json +1 -1
  13. package/.next/standalone/.next/server/app/api/epics/route.js.nft.json +1 -1
  14. package/.next/standalone/.next/server/app/api/goals/[id]/kpis/route.js.nft.json +1 -1
  15. package/.next/standalone/.next/server/app/api/goals/[id]/route.js.nft.json +1 -1
  16. package/.next/standalone/.next/server/app/api/goals/route.js.nft.json +1 -1
  17. package/.next/standalone/.next/server/app/api/hypotheses/[id]/route.js.nft.json +1 -1
  18. package/.next/standalone/.next/server/app/api/hypotheses/route.js.nft.json +1 -1
  19. package/.next/standalone/.next/server/app/api/ideas/[id]/card/route.js.nft.json +1 -1
  20. package/.next/standalone/.next/server/app/api/ideas/[id]/comments/route.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/api/ideas/[id]/implement/route.js.nft.json +1 -1
  22. package/.next/standalone/.next/server/app/api/ideas/[id]/route.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/api/ideas/[id]/transition/route.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/api/ideas/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/implementations/route.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/api/kpis/refresh/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/social/[id]/publish/route.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/api/social/[id]/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/social/route.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/goals/[id]/page_client-reference-manifest.js +1 -1
  31. package/.next/standalone/.next/server/app/goals/page.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/goals/page_client-reference-manifest.js +1 -1
  33. package/.next/standalone/.next/server/app/hypotheses/[id]/page_client-reference-manifest.js +1 -1
  34. package/.next/standalone/.next/server/app/hypotheses/page.js +1 -1
  35. package/.next/standalone/.next/server/app/hypotheses/page.js.nft.json +1 -1
  36. package/.next/standalone/.next/server/app/hypotheses/page_client-reference-manifest.js +1 -1
  37. package/.next/standalone/.next/server/app/ideas/[id]/page.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/ideas/[id]/page_client-reference-manifest.js +1 -1
  39. package/.next/standalone/.next/server/app/page.js +1 -1
  40. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  42. package/.next/standalone/.next/server/app/roadmap/[id]/page_client-reference-manifest.js +1 -1
  43. package/.next/standalone/.next/server/app/roadmap/investors/page.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/roadmap/investors/page_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/roadmap/page.js.nft.json +1 -1
  46. package/.next/standalone/.next/server/app/roadmap/page_client-reference-manifest.js +1 -1
  47. package/.next/standalone/.next/server/app/roadmap/public/page.js.nft.json +1 -1
  48. package/.next/standalone/.next/server/app/roadmap/public/page_client-reference-manifest.js +1 -1
  49. package/.next/standalone/.next/server/app/sessions/page.js.nft.json +1 -1
  50. package/.next/standalone/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  51. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  52. package/.next/standalone/.next/server/app/settings.html +1 -1
  53. package/.next/standalone/.next/server/app/settings.rsc +1 -1
  54. package/.next/standalone/.next/server/app/social/page_client-reference-manifest.js +1 -1
  55. package/.next/standalone/.next/server/app/social.html +1 -1
  56. package/.next/standalone/.next/server/app/social.rsc +1 -1
  57. package/.next/standalone/.next/server/app/updates/[id]/page.js.nft.json +1 -1
  58. package/.next/standalone/.next/server/app/updates/[id]/page_client-reference-manifest.js +1 -1
  59. package/.next/standalone/.next/server/app/updates/new/page_client-reference-manifest.js +1 -1
  60. package/.next/standalone/.next/server/app/updates/new.html +1 -1
  61. package/.next/standalone/.next/server/app/updates/new.rsc +1 -1
  62. package/.next/standalone/.next/server/app/updates/page.js.nft.json +1 -1
  63. package/.next/standalone/.next/server/app/updates/page_client-reference-manifest.js +1 -1
  64. package/.next/standalone/.next/server/app-paths-manifest.json +17 -17
  65. package/.next/standalone/.next/server/chunks/7151.js +10 -10
  66. package/.next/standalone/.next/server/pages/404.html +1 -1
  67. package/.next/standalone/.next/server/pages/500.html +1 -1
  68. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  69. package/.next/standalone/data/business-context.json +1 -1
  70. package/.next/standalone/data/goals.json +1 -1
  71. package/.next/standalone/data/ideas.json +25 -8
  72. package/.next/standalone/data/implementations.json +40 -2
  73. package/.next/standalone/data/reports/visuals/idea-3f4595f7-card.png +0 -0
  74. package/.next/standalone/data/reports/visuals/idea-4rxt3mkj-card.png +0 -0
  75. package/.next/standalone/data/reports/visuals/idea-6631456b-card.png +0 -0
  76. package/.next/standalone/data/reports/visuals/idea-boot-001-card.png +0 -0
  77. package/.next/standalone/data/reports/visuals/idea-fb3eba74-card.png +0 -0
  78. package/.next/standalone/data/reports/visuals/idea-prqf3lob-card.png +0 -0
  79. package/.next/standalone/package.json +1 -1
  80. package/dist/scripts/heartbeat.js +118 -6
  81. package/dist/scripts/scan.js +3 -0
  82. package/dist/scripts/social-routine.js +3 -0
  83. package/package.json +1 -1
  84. /package/.next/static/{fBNMzUSuIGwJGs9aNW81h → kgtR3Ls8MG4aQqwp3I0UE}/_buildManifest.js +0 -0
  85. /package/.next/static/{fBNMzUSuIGwJGs9aNW81h → kgtR3Ls8MG4aQqwp3I0UE}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/654766eb547c6bab.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-a3c37fcbf859f6f9.js"/><script src="/_next/static/chunks/fd9d1056-8c714984d5b17b60.js" async=""></script><script src="/_next/static/chunks/117-23260fd0b5f0bd9a.js" async=""></script><script src="/_next/static/chunks/main-app-f42d9aa726a818bf.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>AI Product Manager</title><meta name="description" content="AI Product Manager - Autonomous improvement proposals"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="min-h-screen bg-slate-50"><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;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><script src="/_next/static/chunks/webpack-a3c37fcbf859f6f9.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/css/654766eb547c6bab.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"2:I[2846,[],\"\"]\n4:I[4707,[],\"\"]\n5:I[6423,[],\"\"]\nb:I[1060,[],\"\"]\n6:{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"}\n7:{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"}\n8:{\"display\":\"inline-block\"}\n9:{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0}\nc:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L2\",null,{\"buildId\":\"fBNMzUSuIGwJGs9aNW81h\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"_not-found\"],\"initialTree\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{},[[\"$L3\",[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null],null],null]},[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"/_not-found\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/654766eb547c6bab.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"className\":\"min-h-screen bg-slate-50\",\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$6\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$7\",\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":\"$8\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$9\",\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],\"$La\"],\"globalErrorComponent\":\"$b\",\"missingSlots\":\"$Wc\"}]\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"AI Product Manager\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"AI Product Manager - Autonomous improvement proposals\"}]]\n3:null\n"])</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/654766eb547c6bab.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-a3c37fcbf859f6f9.js"/><script src="/_next/static/chunks/fd9d1056-8c714984d5b17b60.js" async=""></script><script src="/_next/static/chunks/117-23260fd0b5f0bd9a.js" async=""></script><script src="/_next/static/chunks/main-app-f42d9aa726a818bf.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>AI Product Manager</title><meta name="description" content="AI Product Manager - Autonomous improvement proposals"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="min-h-screen bg-slate-50"><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;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><script src="/_next/static/chunks/webpack-a3c37fcbf859f6f9.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/css/654766eb547c6bab.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"2:I[2846,[],\"\"]\n4:I[4707,[],\"\"]\n5:I[6423,[],\"\"]\nb:I[1060,[],\"\"]\n6:{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"}\n7:{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"}\n8:{\"display\":\"inline-block\"}\n9:{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0}\nc:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L2\",null,{\"buildId\":\"kgtR3Ls8MG4aQqwp3I0UE\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"_not-found\"],\"initialTree\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{},[[\"$L3\",[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null],null],null]},[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"/_not-found\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/654766eb547c6bab.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"className\":\"min-h-screen bg-slate-50\",\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$6\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$7\",\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":\"$8\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$9\",\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],\"$La\"],\"globalErrorComponent\":\"$b\",\"missingSlots\":\"$Wc\"}]\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"AI Product Manager\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"AI Product Manager - Autonomous improvement proposals\"}]]\n3:null\n"])</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><title>500: Internal Server Error</title><meta name="next-head-count" content="3"/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-a3c37fcbf859f6f9.js" defer=""></script><script src="/_next/static/chunks/framework-f66176bb897dc684.js" defer=""></script><script src="/_next/static/chunks/main-6ee938c5db2d5eb4.js" defer=""></script><script src="/_next/static/chunks/pages/_app-72b849fbd24ac258.js" defer=""></script><script src="/_next/static/chunks/pages/_error-7ba65e1336b92748.js" defer=""></script><script src="/_next/static/fBNMzUSuIGwJGs9aNW81h/_buildManifest.js" defer=""></script><script src="/_next/static/fBNMzUSuIGwJGs9aNW81h/_ssgManifest.js" defer=""></script></head><body><div id="__next"><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;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":500}},"page":"/_error","query":{},"buildId":"fBNMzUSuIGwJGs9aNW81h","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><title>500: Internal Server Error</title><meta name="next-head-count" content="3"/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-a3c37fcbf859f6f9.js" defer=""></script><script src="/_next/static/chunks/framework-f66176bb897dc684.js" defer=""></script><script src="/_next/static/chunks/main-6ee938c5db2d5eb4.js" defer=""></script><script src="/_next/static/chunks/pages/_app-72b849fbd24ac258.js" defer=""></script><script src="/_next/static/chunks/pages/_error-7ba65e1336b92748.js" defer=""></script><script src="/_next/static/kgtR3Ls8MG4aQqwp3I0UE/_buildManifest.js" defer=""></script><script src="/_next/static/kgtR3Ls8MG4aQqwp3I0UE/_ssgManifest.js" defer=""></script></head><body><div id="__next"><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;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":500}},"page":"/_error","query":{},"buildId":"kgtR3Ls8MG4aQqwp3I0UE","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- {"node":{"793b9b6dac26832312ff3491cc002e5864502d02":{"workers":{"app/updates/[id]/page":"4445"},"layer":{"app/updates/[id]/page":"rsc"}}},"edge":{},"encryptionKey":"2AHbFEPrMJots4Q+MY72HkVA0SKfnZUpZfspiiG77sk="}
1
+ {"node":{"793b9b6dac26832312ff3491cc002e5864502d02":{"workers":{"app/updates/[id]/page":"4445"},"layer":{"app/updates/[id]/page":"rsc"}}},"edge":{},"encryptionKey":"FPXGr6bC7+RXazd2oi2jDkpRxYAiPKKwH7YGVpUyog0="}
@@ -183,5 +183,5 @@
183
183
  }
184
184
  }
185
185
  ],
186
- "last_auto_update": "2026-02-24T01:21:05.058Z"
186
+ "last_auto_update": "2026-02-26T15:06:39.362Z"
187
187
  }
@@ -444,4 +444,4 @@
444
444
  "related_ideas": []
445
445
  }
446
446
  ]
447
- }
447
+ }
@@ -6217,7 +6217,8 @@
6217
6217
  "output_snippet": "\n=== AI Product Manager - Implementation ===\n\nIdea ID: idea-8c9cf42c\nMode: Scoped sub-task\nMode: Skip PR creation\nTitle: Add workspaces/ and .analysis-prompt.txt to .gitignore\nCategory: security\nTarget repo: vibebusiness\nBranch: ai/idea-8c9cf42c-impl\nWorkspace: /Users/luismey/Code/vibebusiness/workspaces\nUsing pre-configured worktree: /Users/luismey/Code/vibebusiness/workspaces/vibebusiness-worktrees/ai/idea-8c9cf42c-impl-g1\nRunning Claude Code to implement changes (timeout: 600s (model: sonnet))...\nBoth acceptance criteria are met:\n\n- `git status` — neither `workspaces/` nor `data/.analysis-prompt.txt` appears as an untracked file.\n- `git check-ignore -v` output:\n - `.gitignore:86:workspaces/` — matched by line 86\n - `.gitignore:75:data/.analysis-prompt.txt` — matched by line 75\n\nNo changes were needed; both rules were already present in `.gitignore`. No negation rules (`!data/`) exist that could override them.\nClaude Code completed successfully in 15s (423 chars)\nSkipping PR creation (--skip-pr)\n\n=== Implementation Complete (PR skipped) ===\nBranch: ai/idea-8c9cf42c-impl\n"
6218
6218
  }
6219
6219
  ],
6220
- "decomposition_attempts": 1
6220
+ "decomposition_attempts": 1,
6221
+ "pr_creation_attempts": 1
6221
6222
  },
6222
6223
  "comments": [
6223
6224
  {
@@ -7414,7 +7415,7 @@
7414
7415
  {
7415
7416
  "id": "idea-fb3eba74",
7416
7417
  "created_at": "2026-02-19T19:31:25.141Z",
7417
- "updated_at": "2026-02-23T06:00:00Z",
7418
+ "updated_at": "2026-02-26T15:06:50.709Z",
7418
7419
  "title": "Add atomic file writes and per-file locking to storage layer",
7419
7420
  "summary": "All JSON data mutations use read-modify-write without locks or atomic writes, causing silent data loss when heartbeat, analyze, and API routes run concurrently.",
7420
7421
  "category": "tech_debt",
@@ -7429,7 +7430,7 @@
7429
7430
  "Lock contention rate baseline: unmeasured → target: <5 contention events per heartbeat session within 1 week",
7430
7431
  "Session log write count per analysis: baseline ~50 writes → target: 1 write (batch flush) within 1 week"
7431
7432
  ],
7432
- "stage": "in_progress",
7433
+ "stage": "shipped",
7433
7434
  "source": {
7434
7435
  "type": "codebase_analysis",
7435
7436
  "session_id": "session-2c7f65d3",
@@ -7446,7 +7447,7 @@
7446
7447
  "pr_number": null,
7447
7448
  "commits": [],
7448
7449
  "started_at": "2026-02-23T06:00:00Z",
7449
- "completed_at": null,
7450
+ "completed_at": "2026-02-26T15:06:50.709Z",
7450
7451
  "sub_tasks": [
7451
7452
  {
7452
7453
  "id": "st-001",
@@ -7658,7 +7659,7 @@
7658
7659
  }
7659
7660
  ],
7660
7661
  "decomposition_attempts": 1,
7661
- "pr_creation_attempts": 1
7662
+ "pr_creation_attempts": 3
7662
7663
  },
7663
7664
  "comments": [
7664
7665
  {
@@ -7666,6 +7667,20 @@
7666
7667
  "author": "ai-analyst",
7667
7668
  "created_at": "2026-02-22T00:00:00.000Z",
7668
7669
  "body": "TRIAGE 2026-02-22 (dedup-triage-and-approve-inbox): Moved to under_review. Has merit but did not score in top 8 for this triage pass. Re-evaluate in next batch triage when approved queue drops below 3."
7670
+ },
7671
+ {
7672
+ "id": "comment-1772118277051",
7673
+ "author": "system",
7674
+ "author_name": "System",
7675
+ "content": "Auto-shipped: PR creation failed 2 times (likely changes already on main branch). No PR created.",
7676
+ "created_at": "2026-02-26T15:04:37.051Z"
7677
+ },
7678
+ {
7679
+ "id": "comment-1772118410709",
7680
+ "author": "system",
7681
+ "author_name": "System",
7682
+ "content": "Auto-shipped: PR creation failed 3 times (likely changes already on main branch). No PR created.",
7683
+ "created_at": "2026-02-26T15:06:50.709Z"
7669
7684
  }
7670
7685
  ],
7671
7686
  "tags": [
@@ -8903,13 +8918,13 @@
8903
8918
  "summary": "Display a daily briefing as a dashboard view showing KPI snapshots, prioritized recommendations, alerts, and recent activity.",
8904
8919
  "context": "Landing page audit: promises 'delivers morning briefing with prioritized recommendations' but heartbeat only updates STATUS.md — no human-readable summary view exists in the dashboard.",
8905
8920
  "rationale": "The morning briefing is a core differentiator vs. ChatGPT which 'forgets sessions'. Users need a single view that answers 'what happened overnight and what should I focus on today?' without reading raw markdown files.",
8906
- "stage": "approved",
8921
+ "stage": "testing",
8907
8922
  "category": "product",
8908
8923
  "effort": "m",
8909
8924
  "impact": "l",
8910
8925
  "priority": "high",
8911
8926
  "created_at": "2026-02-21T02:44:44.000Z",
8912
- "updated_at": "2026-02-23T05:56:23Z",
8927
+ "updated_at": "2026-02-26T15:04:49.614Z",
8913
8928
  "implementation_plan": "1. Create /briefing route (or prominent section on main dashboard page)\n2. Build BriefingView component that aggregates: KPI snapshot with trends (from /api/goals), top 3 prioritized recommendations (from /api/ideas sorted by score), alerts (stale ideas, at-risk goals, unmeasured KPIs), recently shipped ideas, what the heartbeat worked on (from STATUS.md/TODO.md)\n3. Add API route /api/briefing that compiles all data into a single payload\n4. Make this the default view when user opens dashboard each morning\n5. Add date-based greeting and summary header",
8914
8929
  "success_metrics": [
8915
8930
  "Briefing view loads in <2 seconds with all sections populated",
@@ -9179,7 +9194,9 @@
9179
9194
  "output_snippet": "p/api/briefing/__tests__/integration.test.ts`:\n\n**6 tests covering the full briefing feature:**\n\n1. **API shape test** — Fixtures with 2 goals (3 KPIs total), 5 ideas (1 stale, 1 shipped, 3 actionable). Asserts: status 200, `alerts.length >= 2`, `recommendations.length === 3`, `kpi_snapshots.length === 3`, `recently_shipped` contains only the shipped idea.\n\n2. **Alert accuracy test** — One `at_risk` goal + one `on_track` goal + one stale idea (10 days old). Asserts exactly one `at_risk_goal` alert (severity=`critical`) and one `stale_idea` alert (severity=`warning`), with zero false positives for the healthy goal.\n\n3. **Recommendation scoring test** — Three ideas: `critical+xl` (45), `critical+xs` (41), `high+l` (34). Asserts the top-3 order by `priority_score×10 + impact_score` descending.\n\n4. **Heartbeat parse test** — Mocks `fs.readFileSync` per filename to return `Last check-in: 2026-02-23T09:00:00Z` and task lists. Asserts `last_checkin`, `in_progress_tasks`, and `recently_completed` are parsed correctly.\n\n5. **Error handling test** — `getIdeas()` throws `Error('disk read failure')`. Asserts status 500, `success === false`, and `console.error` was called with `'[/api/briefing] Failed to compile briefing:'`.\n\n6. **Missing files test** — `fs.readFileSync` throws ENOENT. Asserts status is still 200 (graceful degradation) with `heartbeat.last_checkin === null` and empty task arrays.\n\n**Key implementation details:**\n- Uses `vi.hoisted()` to declare mock functions before `vi.mock()` factories run (required for vitest)\n- Mocks both `default` and named exports of `'fs'` to handle either import style\n- Uses typed `Alert` interface inline for safe property access in test 2\n- `beforeEach` resets all mocks and sets `mockReadFileSync` to return `''` by default\nClaude Code completed successfully in 348s (1857 chars)\nChanges detected, staging and committing...\nSkipping PR creation (--skip-pr)\n\n=== Implementation Complete (PR skipped) ===\nBranch: ai/idea-morning-briefing-impl\n"
9180
9195
  }
9181
9196
  ],
9182
- "decomposition_attempts": 1
9197
+ "decomposition_attempts": 1,
9198
+ "pr_url": "https://github.com/braza-ai/100xmanager/pull/32",
9199
+ "pr_number": 32
9183
9200
  },
9184
9201
  "goal_id": "goal-beta-users",
9185
9202
  "expected_impact": "First-run wow factor and daily engagement — users see the product is alive and working for them every morning",
@@ -2435,7 +2435,14 @@
2435
2435
  "[2026-02-23T05:49:08.858Z] Checking out branch: ai/idea-8c9cf42c-impl",
2436
2436
  "[2026-02-23T05:49:08.869Z] Merging origin/main into ai/idea-8c9cf42c-impl...",
2437
2437
  "[2026-02-23T05:49:08.877Z] Create PR only mode — skipping implementation",
2438
- "[2026-02-23T05:49:08.887Z] No commits to push, skipping PR creation"
2438
+ "[2026-02-23T05:49:08.887Z] No commits to push, skipping PR creation",
2439
+ "[2026-02-26T15:06:51.152Z] Fetching latest from origin...",
2440
+ "[2026-02-26T15:06:55.162Z] Checking out branch: ai/idea-8c9cf42c-impl",
2441
+ "[2026-02-26T15:06:55.215Z] Merging origin/main into ai/idea-8c9cf42c-impl...",
2442
+ "[2026-02-26T15:06:55.374Z] Create PR only mode — skipping implementation",
2443
+ "[2026-02-26T15:06:55.387Z] Pushing branch ai/idea-8c9cf42c-impl to origin",
2444
+ "[2026-02-26T15:06:59.131Z] Creating PR with gh CLI",
2445
+ "[2026-02-26T15:07:02.072Z] Failed to create PR: Command failed: gh pr create --title [AI] Add workspaces/ and .analysis-prompt.txt to .gitignore --body-file /var/folders/s2/33gqhmnd6rg3cfpwzl5wvsrc0000gn/T/pr-body-impl-mlyqrgb9.md --base main\npull request create failed: GraphQL: No commits between main and ai/idea-8c9cf42c-impl (createPullRequest)\n"
2439
2446
  ]
2440
2447
  },
2441
2448
  {
@@ -3186,7 +3193,21 @@
3186
3193
  "[2026-02-24T01:13:50.244Z] Create PR only mode — skipping implementation",
3187
3194
  "[2026-02-24T01:13:50.260Z] Pushing branch ai/idea-fb3eba74-impl to origin",
3188
3195
  "[2026-02-24T01:13:51.445Z] Creating PR with gh CLI",
3189
- "[2026-02-24T01:13:52.612Z] Failed to create PR: Command failed: gh pr create --title [AI] Add atomic file writes and per-file locking to storage layer --body-file /var/folders/s2/33gqhmnd6rg3cfpwzl5wvsrc0000gn/T/pr-body-impl-mlzwwp6g.md --base main\na pull request for branch \"ai/idea-fb3eba74-impl\" into branch \"main\" already exists:\nhttps://github.com/braza-ai/100xmanager/pull/29\n"
3196
+ "[2026-02-24T01:13:52.612Z] Failed to create PR: Command failed: gh pr create --title [AI] Add atomic file writes and per-file locking to storage layer --body-file /var/folders/s2/33gqhmnd6rg3cfpwzl5wvsrc0000gn/T/pr-body-impl-mlzwwp6g.md --base main\na pull request for branch \"ai/idea-fb3eba74-impl\" into branch \"main\" already exists:\nhttps://github.com/braza-ai/100xmanager/pull/29\n",
3197
+ "[2026-02-26T15:04:24.063Z] Fetching latest from origin...",
3198
+ "[2026-02-26T15:04:30.185Z] Checking out branch: ai/idea-fb3eba74-impl",
3199
+ "[2026-02-26T15:04:30.217Z] Merging origin/main into ai/idea-fb3eba74-impl...",
3200
+ "[2026-02-26T15:04:30.324Z] Create PR only mode — skipping implementation",
3201
+ "[2026-02-26T15:04:30.336Z] Pushing branch ai/idea-fb3eba74-impl to origin",
3202
+ "[2026-02-26T15:04:34.111Z] Creating PR with gh CLI",
3203
+ "[2026-02-26T15:04:37.015Z] Failed to create PR: Command failed: gh pr create --title [AI] Add atomic file writes and per-file locking to storage layer --body-file /var/folders/s2/33gqhmnd6rg3cfpwzl5wvsrc0000gn/T/pr-body-impl-mlzwwp6g.md --base main\npull request create failed: GraphQL: No commits between main and ai/idea-fb3eba74-impl (createPullRequest)\n",
3204
+ "[2026-02-26T15:06:40.266Z] Fetching latest from origin...",
3205
+ "[2026-02-26T15:06:44.435Z] Checking out branch: ai/idea-fb3eba74-impl",
3206
+ "[2026-02-26T15:06:44.483Z] Merging origin/main into ai/idea-fb3eba74-impl...",
3207
+ "[2026-02-26T15:06:44.494Z] Create PR only mode — skipping implementation",
3208
+ "[2026-02-26T15:06:44.510Z] Pushing branch ai/idea-fb3eba74-impl to origin",
3209
+ "[2026-02-26T15:06:48.065Z] Creating PR with gh CLI",
3210
+ "[2026-02-26T15:06:50.670Z] Failed to create PR: Command failed: gh pr create --title [AI] Add atomic file writes and per-file locking to storage layer --body-file /var/folders/s2/33gqhmnd6rg3cfpwzl5wvsrc0000gn/T/pr-body-impl-mlzwwp6g.md --base main\npull request create failed: GraphQL: No commits between main and ai/idea-fb3eba74-impl (createPullRequest)\n"
3190
3211
  ]
3191
3212
  },
3192
3213
  {
@@ -3299,6 +3320,23 @@
3299
3320
  "[2026-02-24T01:34:12.229Z] Changes detected, staging and committing...",
3300
3321
  "[2026-02-24T01:34:12.318Z] Skipping PR creation (--skip-pr)"
3301
3322
  ]
3323
+ },
3324
+ {
3325
+ "id": "impl-mm3lgu4f",
3326
+ "idea_id": "idea-morning-briefing",
3327
+ "status": "completed",
3328
+ "repo_name": "vibebusiness",
3329
+ "branch_name": "ai/idea-morning-briefing-impl",
3330
+ "workspace_path": "/Users/luismey/Code/vibebusiness/workspaces/vibebusiness",
3331
+ "logs": [
3332
+ "[2026-02-26T15:04:37.503Z] Implementation started",
3333
+ "[2026-02-26T15:04:37.504Z] Fetching latest from origin...",
3334
+ "[2026-02-26T15:04:41.557Z] Checking out branch: ai/idea-morning-briefing-impl",
3335
+ "[2026-02-26T15:04:41.599Z] Merging origin/main into ai/idea-morning-briefing-impl...",
3336
+ "[2026-02-26T15:04:41.689Z] Create PR only mode — skipping implementation",
3337
+ "[2026-02-26T15:04:41.700Z] Pushing branch ai/idea-morning-briefing-impl to origin",
3338
+ "[2026-02-26T15:04:45.865Z] Creating PR with gh CLI"
3339
+ ]
3302
3340
  }
3303
3341
  ]
3304
3342
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibebusiness",
3
- "version": "1.2.86",
3
+ "version": "1.2.87",
4
4
  "description": "AI-powered autonomous product manager. Research. Build. Ship. Grow.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "private": false,
@@ -9594,6 +9594,9 @@ function invokeClaudeCLI(options, claudePath) {
9594
9594
  stderr += data.toString();
9595
9595
  });
9596
9596
  if (useStdin && child.stdin) {
9597
+ child.stdin.on("error", (err2) => {
9598
+ if (err2.code !== "EPIPE") throw err2;
9599
+ });
9597
9600
  child.stdin.write(options.prompt);
9598
9601
  child.stdin.end();
9599
9602
  }
@@ -34166,6 +34169,14 @@ function execGit(args2, cwd, timeoutMs) {
34166
34169
  throw new Error(`git ${args2[0]} failed: ${stderr || execError.message}`);
34167
34170
  }
34168
34171
  }
34172
+ function checkGitAvailable() {
34173
+ try {
34174
+ (0, import_child_process10.execFileSync)("git", ["--version"], { stdio: "pipe", timeout: 5e3 });
34175
+ return true;
34176
+ } catch {
34177
+ return false;
34178
+ }
34179
+ }
34169
34180
 
34170
34181
  // scripts/lib/shell-safe.ts
34171
34182
  var SAFE_BRANCH_RE = /^[a-zA-Z0-9._\-/]+$/;
@@ -34859,6 +34870,9 @@ init_paths();
34859
34870
  var ROOT_DIR = PROJECT_DIR;
34860
34871
  var execAsync = (0, import_util.promisify)(import_child_process11.exec);
34861
34872
  var DEFAULT_MAX_DECOMP_ATTEMPTS = 2;
34873
+ var MAX_REASONING_PROMPT_CHARS = 8e4;
34874
+ var MAX_CONTEXT_CHARS = 2e4;
34875
+ var IDLE_THRESHOLD = 2;
34862
34876
  function spawnAsync(cmd, args2, options) {
34863
34877
  return new Promise((resolve3, reject) => {
34864
34878
  const child = (0, import_child_process11.spawn)(cmd, args2, {
@@ -35736,13 +35750,16 @@ function buildContextForClaude(state, alerts, businessContext) {
35736
35750
  in_progress: state.ideas.filter((i) => i.stage === "in_progress").map((i) => {
35737
35751
  const subTasks = i.implementation.sub_tasks || [];
35738
35752
  const completed = subTasks.filter((st) => st.status === "completed").length;
35739
- const failed = subTasks.filter((st) => st.status === "failed").length;
35753
+ const failedTasks = subTasks.filter((st) => st.status === "failed");
35754
+ const lastFailedTask = failedTasks.length > 0 ? failedTasks[failedTasks.length - 1] : null;
35755
+ const lastFailureMsg = lastFailedTask?.error_message ? lastFailedTask.error_message.substring(0, 120) : null;
35740
35756
  return {
35741
35757
  id: i.id,
35742
35758
  title: i.title,
35743
35759
  days_in_progress: daysSince(i.updated_at),
35744
35760
  branch: i.implementation.branch_name,
35745
- sub_task_progress: subTasks.length > 0 ? `${completed}/${subTasks.length} done${failed > 0 ? `, ${failed} failed` : ""}` : null
35761
+ sub_task_progress: subTasks.length > 0 ? `${completed}/${subTasks.length} done${failedTasks.length > 0 ? `, ${failedTasks.length} failed` : ""}` : null,
35762
+ last_failure: lastFailureMsg
35746
35763
  };
35747
35764
  }),
35748
35765
  shipped: state.ideas.filter((i) => i.stage === "shipped").map((i) => ({
@@ -35860,8 +35877,33 @@ async function runClaudeReasoning(state, alerts, businessContext) {
35860
35877
  const memorySection = memoryContext ? `
35861
35878
 
35862
35879
  LEARNINGS FROM PREVIOUS SESSIONS:
35880
+ IMPORTANT: Any MEMORY.md entry that asserts a file exists, is missing, is a placeholder, or is disabled \u2014 re-read the referenced file NOW before treating it as current. Memory entries are hypotheses, not ground truth.
35863
35881
  ${memoryContext}
35864
35882
  ` : "";
35883
+ const CONTEXT_BUDGET = MAX_CONTEXT_CHARS;
35884
+ const contextObj = context;
35885
+ const ideasObj = contextObj.ideas;
35886
+ const contextSize = () => JSON.stringify(contextObj).length + memoryContext.length;
35887
+ if (contextSize() > CONTEXT_BUDGET && ideasObj && Array.isArray(ideasObj.shipped)) {
35888
+ const count = ideasObj.shipped.length;
35889
+ if (count > 0) {
35890
+ ideasObj.shipped = `${count} shipped ideas omitted`;
35891
+ log(`[context-trim] Dropped shipped ideas (${count})`);
35892
+ }
35893
+ }
35894
+ if (contextSize() > CONTEXT_BUDGET && ideasObj && Array.isArray(ideasObj.inbox)) {
35895
+ ideasObj.inbox = ideasObj.inbox.map((i) => ({
35896
+ id: i.id,
35897
+ title: i.title,
35898
+ priority: i.priority,
35899
+ days_in_inbox: i.days_in_inbox
35900
+ }));
35901
+ log(`[context-trim] Trimmed inbox idea details`);
35902
+ }
35903
+ if (contextSize() > CONTEXT_BUDGET && contextObj.codebase_context) {
35904
+ contextObj.codebase_context = "[codebase_context omitted to reduce prompt size]";
35905
+ log(`[context-trim] Dropped codebase_context`);
35906
+ }
35865
35907
  const prompt = `You are the AI Product Manager for ${productName}${productSummary}.
35866
35908
 
35867
35909
  CURRENT STATE:
@@ -35873,7 +35915,11 @@ Your job is to analyze this state and recommend the next action. Consider:
35873
35915
  3. Are there ideas stuck that need to be moved forward?
35874
35916
  4. What should be prioritized next?
35875
35917
  5. Approved ideas are pre-sorted by score (priority \xD7 impact / effort, boosted by goal and hypothesis alignment). Prefer the highest-scored idea unless you have a specific reason to override (funnel stage mismatch, stale assumption, or a critical alert). Reference the score when explaining your choice. If recommending implementation, use task_id "implement-{ideaId}".
35876
- 6. Are there in_progress ideas with sub-tasks? Check their progress.
35918
+ 6. Are there in_progress ideas with sub-tasks? Check their progress. If an idea shows "last_failure", that is the most recent error from the last sub-task execution.
35919
+
35920
+ FM3 \u2014 IMPLEMENTATION RETRY RULES:
35921
+ - For any implement-* task where the idea shows a non-null "last_failure": you MUST NOT recommend the same task unless you explicitly state a different strategy in the analysis.
35922
+ - If last_failure indicates an unresolvable environment issue (e.g., "ENOENT", "permission denied", "network unreachable", "git not found"), move the task to Blocked immediately instead of retrying. Set autonomous=false in next_action so the system routes it to Blocked.
35877
35923
 
35878
35924
  DATA FRESHNESS CHECK:
35879
35925
  Before acting on any TODO or idea description, verify its assumptions against live_data:
@@ -35907,6 +35953,7 @@ META-TASKS:
35907
35953
  - "batch-cleanup" \u2014 Multiple cleanup operations in one pass
35908
35954
  - Use descriptive task_id names and detailed descriptions so the executor knows exactly what to do
35909
35955
  - The description field is critical \u2014 it's the full instruction set for the executor
35956
+ - FM2: For research/spike tasks whose output is a file (docs, reports, analysis), append [expects: relative/path] to the description. Example: "Research DATAJUD API endpoints [expects: docs/spike-datajud.md]". The system will verify the file exists after completion \u2014 tasks that skip file creation will be kept in High Priority and retried.
35910
35957
 
35911
35958
  EVALUATION TASKS:
35912
35959
  - To evaluate a shipped idea's success metrics, use task_id: "evaluate-shipped-{ideaId}"
@@ -36144,6 +36191,9 @@ If there's nothing urgent, set next_action to null and new_todos to an empty arr
36144
36191
  Focus on actionable, specific recommendations. Be concise.`;
36145
36192
  const startTime = Date.now();
36146
36193
  const promptSize = prompt.length;
36194
+ if (promptSize > MAX_REASONING_PROMPT_CHARS) {
36195
+ log(`[context-trim] WARNING: Total prompt is ${promptSize} chars (over ${MAX_REASONING_PROMPT_CHARS} soft cap) \u2014 may cause timeout`);
36196
+ }
36147
36197
  log(`Running Claude reasoning (prompt: ${promptSize} chars)...`);
36148
36198
  const reasoningSchema = {
36149
36199
  type: "object",
@@ -37205,6 +37255,11 @@ async function executeAutonomousImplementation(ideaId) {
37205
37255
  log(`Autonomy not enabled, skipping implementation for ${ideaId}`);
37206
37256
  return false;
37207
37257
  }
37258
+ if (!checkGitAvailable()) {
37259
+ log("[pre-flight] git not found in PATH (ENOENT) \u2014 implementation tasks unavailable");
37260
+ reclassifyAsHumanDependent(`implement-${ideaId}`);
37261
+ return false;
37262
+ }
37208
37263
  const ideasData = loadJson(IDEAS_FILE, { ideas: [] });
37209
37264
  let idea = ideasData.ideas.find((i) => i.id === ideaId);
37210
37265
  if (!idea && !ideaId.startsWith("idea-")) {
@@ -37633,6 +37688,18 @@ ${allowedFiles.map((f) => `- ${f}`).join("\n")}
37633
37688
  resolve3(false);
37634
37689
  return;
37635
37690
  }
37691
+ const expectsMatch = description.match(/\[expects:\s*([^\]]+)\]/);
37692
+ if (expectsMatch) {
37693
+ const expectedRelPath = expectsMatch[1].trim();
37694
+ const expectedFullPath = path30.join(PROJECT_DIR, expectedRelPath);
37695
+ if (!fs35.existsSync(expectedFullPath)) {
37696
+ log(`[FM2] Artifact verification FAILED for ${taskId}: expected "${expectedRelPath}" but file not found`);
37697
+ incrementMetaTaskFailureCount(taskId);
37698
+ resolve3(false);
37699
+ return;
37700
+ }
37701
+ log(`[FM2] Artifact verification passed: ${expectedRelPath} exists`);
37702
+ }
37636
37703
  log(`Meta-task completed: ${output.substring(0, 200)}`);
37637
37704
  resolve3(true);
37638
37705
  } else {
@@ -38871,7 +38938,33 @@ function updateTodoFile(taskId, completed) {
38871
38938
  log(`Failed to update TODO.md: ${error instanceof Error ? error.message : "Unknown error"}`);
38872
38939
  }
38873
38940
  }
38874
- function generateStatusContent(state, alerts, nextTask, reasoning, systemHealth) {
38941
+ function readConsecutiveNoops() {
38942
+ try {
38943
+ if (!fs35.existsSync(STATUS_FILE)) return 0;
38944
+ const content = fs35.readFileSync(STATUS_FILE, "utf-8");
38945
+ const match = content.match(/^consecutive_noops:\s*(\d+)/m);
38946
+ return match ? parseInt(match[1], 10) : 0;
38947
+ } catch {
38948
+ return 0;
38949
+ }
38950
+ }
38951
+ function ensureSystemIdleTask() {
38952
+ try {
38953
+ const content = fs35.readFileSync(TODO_FILE, "utf-8");
38954
+ if (content.includes("`system-idle`")) return;
38955
+ const highPriorityMarker = "## High Priority";
38956
+ const idx = content.indexOf(highPriorityMarker);
38957
+ if (idx === -1) return;
38958
+ const insertAt = content.indexOf("\n", idx) + 1;
38959
+ const idleLine = "\n- [ ] `system-idle` \u2014 All autonomous tasks are blocked. Review Blocked section and unblock manually.\n";
38960
+ const newContent = content.slice(0, insertAt) + idleLine + content.slice(insertAt);
38961
+ fs35.writeFileSync(TODO_FILE, newContent);
38962
+ log("[IDLE] Added system-idle task to TODO.md High Priority section");
38963
+ } catch (error) {
38964
+ log(`Failed to add system-idle task: ${error instanceof Error ? error.message : "Unknown"}`);
38965
+ }
38966
+ }
38967
+ function generateStatusContent(state, alerts, nextTask, reasoning, systemHealth, consecutiveNoops) {
38875
38968
  const now = /* @__PURE__ */ new Date();
38876
38969
  const currentGoal = state.goals[0];
38877
38970
  const goalSection = currentGoal ? `- **Goal:** ${currentGoal.title} (${currentGoal.target_value}${currentGoal.target_unit} by Q2 2026)
@@ -38923,6 +39016,7 @@ ${systemHealth.recovery_actions.map((a) => `- ${a}`).join("\n")}
38923
39016
 
38924
39017
  **Last Heartbeat:** ${formatDateTime(now)}
38925
39018
  **Next Scheduled:** ${nextScheduled}
39019
+ consecutive_noops: ${consecutiveNoops ?? 0}
38926
39020
 
38927
39021
  ## Current Focus
38928
39022
 
@@ -38995,6 +39089,7 @@ async function runSingleHeartbeat(beatNumber = 1) {
38995
39089
  if (SKIP_REASONING) {
38996
39090
  log("Skipping Claude reasoning step");
38997
39091
  }
39092
+ let consecutiveNoops = readConsecutiveNoops();
38998
39093
  const state = loadState4();
38999
39094
  const businessContext = loadBusinessContext();
39000
39095
  const heartbeatConfig = loadConfig();
@@ -39068,6 +39163,7 @@ async function runSingleHeartbeat(beatNumber = 1) {
39068
39163
  };
39069
39164
  log(`Task override: ${taskToDo.id} \u2014 ${taskToDo.description}`);
39070
39165
  }
39166
+ let inlineWorkDone = false;
39071
39167
  if (!TASK_OVERRIDE) {
39072
39168
  const inProgressOverride = (() => {
39073
39169
  const cfgCheck = loadConfig();
@@ -39105,6 +39201,7 @@ async function runSingleHeartbeat(beatNumber = 1) {
39105
39201
  const success = await executeTask(reasoning.next_action, heartbeatConfig, businessContext);
39106
39202
  if (success) {
39107
39203
  taskToDo = null;
39204
+ inlineWorkDone = true;
39108
39205
  } else {
39109
39206
  log(`Critical task failed, resuming in-progress work: ${inProgressOverride.id}`);
39110
39207
  taskToDo = inProgressOverride;
@@ -39128,7 +39225,9 @@ async function runSingleHeartbeat(beatNumber = 1) {
39128
39225
  taskToDo = existingTask;
39129
39226
  } else {
39130
39227
  const success = await executeTask(reasoning.next_action, heartbeatConfig, businessContext);
39131
- if (!success) {
39228
+ if (success) {
39229
+ inlineWorkDone = true;
39230
+ } else {
39132
39231
  taskToDo = determineWork(state);
39133
39232
  }
39134
39233
  }
@@ -39136,9 +39235,19 @@ async function runSingleHeartbeat(beatNumber = 1) {
39136
39235
  taskToDo = determineWork(state);
39137
39236
  }
39138
39237
  }
39238
+ if (!taskToDo && !inlineWorkDone && !TASK_OVERRIDE && !DRY_RUN) {
39239
+ consecutiveNoops++;
39240
+ log(`[IDLE] No task determined (consecutive_noops: ${consecutiveNoops})`);
39241
+ if (consecutiveNoops >= IDLE_THRESHOLD) {
39242
+ log(`[IDLE] All actionable tasks blocked. Pausing autonomous work (${consecutiveNoops} consecutive no-ops >= threshold ${IDLE_THRESHOLD}).`);
39243
+ ensureSystemIdleTask();
39244
+ }
39245
+ }
39246
+ let taskSucceeded = false;
39139
39247
  if (taskToDo) {
39140
39248
  log(`Task to do: ${taskToDo.id} \u2014 ${taskToDo.description}`);
39141
39249
  const success = await executeTask(taskToDo, heartbeatConfig, businessContext);
39250
+ taskSucceeded = success;
39142
39251
  if (success && !DRY_RUN) {
39143
39252
  if (!["quick-analysis", "deep-analysis", "metrics-analysis", "seo-audit"].includes(taskToDo.id)) {
39144
39253
  updateTodoFile(taskToDo.id, true);
@@ -39184,6 +39293,9 @@ async function runSingleHeartbeat(beatNumber = 1) {
39184
39293
  } else {
39185
39294
  log("No tasks to do right now");
39186
39295
  }
39296
+ if (taskSucceeded || inlineWorkDone) {
39297
+ consecutiveNoops = 0;
39298
+ }
39187
39299
  if (reasoning?.new_todos && reasoning.new_todos.length > 0 && !DRY_RUN) {
39188
39300
  const MAX_NEW_TODOS_PER_HEARTBEAT = 2;
39189
39301
  const cappedTodos = reasoning.new_todos.slice(0, MAX_NEW_TODOS_PER_HEARTBEAT);
@@ -39197,7 +39309,7 @@ async function runSingleHeartbeat(beatNumber = 1) {
39197
39309
  pruneMemoryLearnings();
39198
39310
  }
39199
39311
  if (!DRY_RUN) {
39200
- const statusContent = generateStatusContent(state, alerts, taskToDo, reasoning, systemHealth);
39312
+ const statusContent = generateStatusContent(state, alerts, taskToDo, reasoning, systemHealth, consecutiveNoops);
39201
39313
  fs35.writeFileSync(STATUS_FILE, statusContent);
39202
39314
  log("Updated STATUS.md");
39203
39315
  } else {
@@ -170,6 +170,9 @@ function invokeClaudeCLI(options, claudePath) {
170
170
  stderr += data.toString();
171
171
  });
172
172
  if (useStdin && child.stdin) {
173
+ child.stdin.on("error", (err) => {
174
+ if (err.code !== "EPIPE") throw err;
175
+ });
173
176
  child.stdin.write(options.prompt);
174
177
  child.stdin.end();
175
178
  }
@@ -7266,6 +7266,9 @@ function invokeClaudeCLI(options, claudePath) {
7266
7266
  stderr += data.toString();
7267
7267
  });
7268
7268
  if (useStdin && child.stdin) {
7269
+ child.stdin.on("error", (err) => {
7270
+ if (err.code !== "EPIPE") throw err;
7271
+ });
7269
7272
  child.stdin.write(options.prompt);
7270
7273
  child.stdin.end();
7271
7274
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibebusiness",
3
- "version": "1.2.86",
3
+ "version": "1.2.87",
4
4
  "description": "AI-powered autonomous product manager. Research. Build. Ship. Grow.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "private": false,