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.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-build-manifest.json +29 -29
- package/.next/standalone/.next/app-path-routes-manifest.json +1 -1
- package/.next/standalone/.next/build-manifest.json +2 -2
- package/.next/standalone/.next/prerender-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
- package/.next/standalone/.next/server/app/api/analyze/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/config/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/epics/[id]/ideas/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/epics/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/epics/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/goals/[id]/kpis/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/goals/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/goals/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/hypotheses/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/hypotheses/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[id]/card/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[id]/comments/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[id]/implement/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[id]/transition/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/implementations/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/kpis/refresh/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/social/[id]/publish/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/social/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/social/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/goals/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/goals/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/goals/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/hypotheses/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/hypotheses/page.js +1 -1
- package/.next/standalone/.next/server/app/hypotheses/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/hypotheses/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/ideas/[id]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/ideas/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/page.js +1 -1
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/roadmap/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/roadmap/investors/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/roadmap/investors/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/roadmap/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/roadmap/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/roadmap/public/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/roadmap/public/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/sessions/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings.html +1 -1
- package/.next/standalone/.next/server/app/settings.rsc +1 -1
- package/.next/standalone/.next/server/app/social/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/social.html +1 -1
- package/.next/standalone/.next/server/app/social.rsc +1 -1
- package/.next/standalone/.next/server/app/updates/[id]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/updates/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/updates/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/updates/new.html +1 -1
- package/.next/standalone/.next/server/app/updates/new.rsc +1 -1
- package/.next/standalone/.next/server/app/updates/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/updates/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +17 -17
- package/.next/standalone/.next/server/chunks/7151.js +10 -10
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/data/business-context.json +1 -1
- package/.next/standalone/data/goals.json +1 -1
- package/.next/standalone/data/ideas.json +25 -8
- package/.next/standalone/data/implementations.json +40 -2
- package/.next/standalone/data/reports/visuals/idea-3f4595f7-card.png +0 -0
- package/.next/standalone/data/reports/visuals/idea-4rxt3mkj-card.png +0 -0
- package/.next/standalone/data/reports/visuals/idea-6631456b-card.png +0 -0
- package/.next/standalone/data/reports/visuals/idea-boot-001-card.png +0 -0
- package/.next/standalone/data/reports/visuals/idea-fb3eba74-card.png +0 -0
- package/.next/standalone/data/reports/visuals/idea-prqf3lob-card.png +0 -0
- package/.next/standalone/package.json +1 -1
- package/dist/scripts/heartbeat.js +118 -6
- package/dist/scripts/scan.js +3 -0
- package/dist/scripts/social-routine.js +3 -0
- package/package.json +1 -1
- /package/.next/static/{fBNMzUSuIGwJGs9aNW81h → kgtR3Ls8MG4aQqwp3I0UE}/_buildManifest.js +0 -0
- /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,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";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\":\"
|
|
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,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";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/
|
|
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,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";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":"
|
|
1
|
+
{"node":{"793b9b6dac26832312ff3491cc002e5864502d02":{"workers":{"app/updates/[id]/page":"4445"},"layer":{"app/updates/[id]/page":"rsc"}}},"edge":{},"encryptionKey":"FPXGr6bC7+RXazd2oi2jDkpRxYAiPKKwH7YGVpUyog0="}
|
|
@@ -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-
|
|
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": "
|
|
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":
|
|
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":
|
|
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": "
|
|
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-
|
|
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
|
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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
|
|
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${
|
|
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
|
|
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 (
|
|
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 {
|
package/dist/scripts/scan.js
CHANGED
|
@@ -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
|
File without changes
|
|
File without changes
|