@attalabs/vinaya 0.19.3 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/README.md +81 -0
  2. package/aeg-root/contracts/archivist-tranche-archivist.md +2 -2
  3. package/aeg-root/contracts/tranche-archivist-planner.md +8 -8
  4. package/aeg-root/enforcement.md +18 -9
  5. package/aeg-root/milestone-model.md +3 -1
  6. package/aeg-root/process.md +5 -5
  7. package/aeg-root/roles/architect.md +2 -2
  8. package/aeg-root/roles/archivist.md +10 -11
  9. package/aeg-root/roles/brief-author.md +1 -1
  10. package/aeg-root/roles/developer.md +4 -3
  11. package/aeg-root/roles/planner.md +2 -2
  12. package/aeg-root/roles/principal.md +2 -1
  13. package/aeg-root/roles/tranche-archivist.md +5 -18
  14. package/aeg-root/skills/aeg/SKILL.md +30 -1
  15. package/aeg-root/skills/aeg-roles/SKILL.md +1 -1
  16. package/aeg-root/skills/brief-authoring/SKILL.md +2 -2
  17. package/aeg-root/state-machine.md +8 -6
  18. package/aeg-root/task-model.md +1 -1
  19. package/aeg-root/templates/issue-rationale-template.md +4 -4
  20. package/aeg-root/templates/pr-report-template.md +4 -0
  21. package/aeg-root/tranche-model.md +1 -1
  22. package/dist/checks/bin/check-body-bare-digits.js +473 -32
  23. package/dist/checks/bin/check-branch-topology.js +792 -11
  24. package/dist/checks/bin/check-brief-shape.js +353 -11
  25. package/dist/checks/bin/check-changeset-coverage.js +4156 -0
  26. package/dist/checks/bin/check-closes-n.js +792 -11
  27. package/dist/checks/bin/check-coherence.js +831 -15
  28. package/dist/checks/bin/check-dead-branch-push.js +353 -11
  29. package/dist/checks/bin/check-dispatch-readiness.js +996 -28
  30. package/dist/checks/bin/check-doc-coverage-push.js +449 -22
  31. package/dist/checks/bin/check-doc-coverage.js +449 -22
  32. package/dist/checks/bin/check-doctrine-portability.js +392 -15
  33. package/dist/checks/bin/check-evidence-fresh.js +462 -20
  34. package/dist/checks/bin/check-first-push-dispatch.js +898 -26
  35. package/dist/checks/bin/check-issue-assignment.js +792 -11
  36. package/dist/checks/bin/check-main-branch-refusal.js +3973 -0
  37. package/dist/checks/bin/check-no-disk-state.js +353 -11
  38. package/dist/checks/bin/check-quoted-command.js +4405 -0
  39. package/dist/checks/bin/check-reader-resolvable-prose.js +466 -20
  40. package/dist/checks/bin/check-registry-gates.js +467 -16
  41. package/dist/checks/bin/check-retired-vocabulary.js +465 -19
  42. package/dist/checks/bin/check-review-gate.js +392 -15
  43. package/dist/checks/bin/check-single-plan-pr.js +353 -11
  44. package/dist/checks/bin/check-test-plan.js +353 -11
  45. package/dist/checks/bin/check-token-collection-wired.js +3975 -0
  46. package/dist/checks/bin/check-workspace-escape.js +353 -11
  47. package/dist/index.js +1921 -420
  48. package/package.json +1 -1
  49. package/studio-standalone/_node_modules/@attalabs/vinaya/studio-standalone/_node_modules/@attalabs/aeg-core/bin/verify-coherence.ts +1089 -0
  50. package/studio-standalone/apps/vinaya-studio/web/.next/BUILD_ID +1 -1
  51. package/studio-standalone/apps/vinaya-studio/web/.next/build-manifest.json +3 -3
  52. package/studio-standalone/apps/vinaya-studio/web/.next/prerender-manifest.json +3 -3
  53. package/studio-standalone/apps/vinaya-studio/web/.next/required-server-files.json +5 -0
  54. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/_global-error.html +1 -1
  55. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/_global-error.rsc +1 -1
  56. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  57. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  58. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  59. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  60. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  61. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/_not-found/page/server-reference-manifest.json +2 -2
  62. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/_not-found/page.js +2 -2
  63. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  64. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  65. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/api/coherence/route.js +1 -1
  66. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/api/coherence/route.js.nft.json +1 -1
  67. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/page/server-reference-manifest.json +2 -2
  68. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/page.js +2 -2
  69. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/page.js.nft.json +1 -1
  70. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/page_client-reference-manifest.js +1 -1
  71. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/backlog/page/server-reference-manifest.json +2 -2
  72. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/backlog/page.js +2 -2
  73. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/backlog/page.js.nft.json +1 -1
  74. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/backlog/page_client-reference-manifest.js +1 -1
  75. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/page/server-reference-manifest.json +2 -2
  76. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/page.js +3 -3
  77. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/page.js.nft.json +1 -1
  78. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/page_client-reference-manifest.js +1 -1
  79. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/projects/[name]/page/server-reference-manifest.json +2 -2
  80. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/projects/[name]/page.js +3 -3
  81. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/projects/[name]/page.js.nft.json +1 -1
  82. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/projects/[name]/page_client-reference-manifest.js +1 -1
  83. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/projects/[name]/tranches/[slug]/page/server-reference-manifest.json +2 -2
  84. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/projects/[name]/tranches/[slug]/page.js +3 -3
  85. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/projects/[name]/tranches/[slug]/page.js.nft.json +1 -1
  86. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/projects/[name]/tranches/[slug]/page_client-reference-manifest.js +1 -1
  87. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/projects/[name]/tranches/[slug]/tasks/[taskId]/page/server-reference-manifest.json +2 -2
  88. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/projects/[name]/tranches/[slug]/tasks/[taskId]/page.js +3 -3
  89. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/projects/[name]/tranches/[slug]/tasks/[taskId]/page.js.nft.json +1 -1
  90. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/projects/[name]/tranches/[slug]/tasks/[taskId]/page_client-reference-manifest.js +1 -1
  91. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/projects/page/server-reference-manifest.json +2 -2
  92. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/projects/page.js +3 -3
  93. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/projects/page.js.nft.json +1 -1
  94. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/projects/page_client-reference-manifest.js +1 -1
  95. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/tranches/page/server-reference-manifest.json +2 -2
  96. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/tranches/page.js +2 -2
  97. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/tranches/page.js.nft.json +1 -1
  98. package/studio-standalone/apps/vinaya-studio/web/.next/server/app/studio/tranches/page_client-reference-manifest.js +1 -1
  99. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/{[externals]__0pvgf28._.js → [externals]__1agj1ww._.js} +2 -2
  100. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/[root-of-the-server]__02a-3g8._.js +1 -1
  101. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/1q96_modules_@clerk_nextjs_dist_esm_app-router_client_keyless-creator-reader_0lom2js.js +1 -1
  102. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/[root-of-the-server]__0053k9k._.js +1 -1
  103. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/[root-of-the-server]__0112h-k._.js +1 -1
  104. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/[root-of-the-server]__040smoa._.js +1 -1
  105. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/[root-of-the-server]__0cxtq46._.js +25 -18
  106. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/[root-of-the-server]__0o771t1._.js +1 -1
  107. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/{[root-of-the-server]__03jepya._.js → [root-of-the-server]__0ozbaq0._.js} +1 -1
  108. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/[root-of-the-server]__0puovz5._.js +1 -1
  109. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/{[root-of-the-server]__0ykun-j._.js → [root-of-the-server]__0z6dav-._.js} +3 -3
  110. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/[root-of-the-server]__18kqy4q._.js +1 -1
  111. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/[root-of-the-server]__19jyp3m._.js +1 -1
  112. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/[root-of-the-server]__1hs0dcu._.js +1 -1
  113. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/[root-of-the-server]__1wc4-ip._.js +1 -1
  114. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/[root-of-the-server]__1widio3._.js +1 -1
  115. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/[root-of-the-server]__1yoa8tx._.js +3 -0
  116. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/_03x_w6q._.js +1 -1
  117. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/_0gvm3og._.js +1 -1
  118. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/_0lwxg63._.js +1 -1
  119. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/_0wxycau._.js +1 -1
  120. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/_0x999pb._.js +1 -1
  121. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/_1-6rzip._.js +1 -1
  122. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/_1fqw88f._.js +2 -2
  123. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/{_0zys35s._.js → _1mqrlbl._.js} +2 -2
  124. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/{_1c9b9j-._.js → _1mrtj0f._.js} +2 -2
  125. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/_1n0cnq-._.js +1 -1
  126. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/{apps_vinaya-studio_web_src_app_studio_18kqbvs._.js → apps_vinaya-studio_web_src_app_studio_06it6s-._.js} +2 -2
  127. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/apps_vinaya-studio_web_src_app_studio_projects_[name]_tranches_[slug]_05ufo8i._.js +1 -1
  128. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/node_modules_1vo08dj._.js +2 -2
  129. package/studio-standalone/apps/vinaya-studio/web/.next/server/middleware-build-manifest.js +3 -3
  130. package/studio-standalone/apps/vinaya-studio/web/.next/server/pages/500.html +1 -1
  131. package/studio-standalone/apps/vinaya-studio/web/.next/server/server-reference-manifest.js +1 -1
  132. package/studio-standalone/apps/vinaya-studio/web/.next/server/server-reference-manifest.json +3 -3
  133. package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/0r4i_ks9z02bw.js +1 -0
  134. package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/{3noqvds-2bvrd.js → 1hfhxjy577l5d.js} +1 -1
  135. package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/1k916ih3p4nsg.js +1 -0
  136. package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/{29-foak16tjfu.js → 1t2kft7bxzuxn.js} +1 -1
  137. package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/{2iysedx-n06xc.js → 1ybrihl5_aocy.js} +1 -1
  138. package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/{30ojnsx3p4lp4.js → 1yqs2zgvwa4p1.js} +1 -1
  139. package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/{0msr2a1i-x-br.js → 25kbt5k-xb2a5.js} +1 -1
  140. package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/{3gehliafvmjo9.js → 2_k6j1o9q5nn4.js} +4 -4
  141. package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/2hmannd4bjhzy.js +1 -0
  142. package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/3mqu_uhluy19i.css +1 -0
  143. package/studio-standalone/apps/vinaya-studio/web/package.json +2 -2
  144. package/studio-standalone/apps/vinaya-studio/web/server.js +1 -1
  145. package/aeg-root/coordination.md +0 -292
  146. package/studio-standalone/apps/vinaya-studio/web/.next/server/chunks/ssr/[root-of-the-server]__1rku4gz._.js +0 -3
  147. package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/25j-y57ng11hl.js +0 -1
  148. package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/30lyvn0yzwdiz.js +0 -1
  149. package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/35u8inxa732is.js +0 -1
  150. package/studio-standalone/apps/vinaya-studio/web/.next/static/chunks/42wxpzjhw7oy4.css +0 -1
  151. /package/studio-standalone/apps/vinaya-studio/web/.next/static/{5Lv83SnT--7YJDjSbxona → crNCHQ9uAgKOYC6DKkZma}/_buildManifest.js +0 -0
  152. /package/studio-standalone/apps/vinaya-studio/web/.next/static/{5Lv83SnT--7YJDjSbxona → crNCHQ9uAgKOYC6DKkZma}/_clientMiddlewareManifest.js +0 -0
  153. /package/studio-standalone/apps/vinaya-studio/web/.next/static/{5Lv83SnT--7YJDjSbxona → crNCHQ9uAgKOYC6DKkZma}/_ssgManifest.js +0 -0
@@ -9,7 +9,7 @@ const currentPort = parseInt(process.env.PORT, 10) || 3000
9
9
  const hostname = process.env.HOSTNAME || '0.0.0.0'
10
10
 
11
11
  let keepAliveTimeout = parseInt(process.env.KEEP_ALIVE_TIMEOUT, 10)
12
- const nextConfig = {"env":{},"typescript":{"ignoreBuildErrors":false},"typedRoutes":false,"distDir":"./.next","cleanDistDir":true,"assetPrefix":"","cacheMaxMemorySize":52428800,"configOrigin":"next.config.ts","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"poweredByHeader":true,"compress":true,"images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":14400,"formats":["image/webp"],"maximumRedirects":3,"maximumResponseBody":50000000,"dangerouslyAllowLocalIP":false,"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"attachment","localPatterns":[{"pathname":"**","search":""}],"remotePatterns":[],"qualities":[75],"unoptimized":false,"customCacheHandler":false},"devIndicators":{"position":"bottom-left"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"basePath":"","sassOptions":{},"trailingSlash":false,"i18n":null,"productionBrowserSourceMaps":false,"excludeDefaultMomentLocales":true,"reactProductionProfiling":false,"reactStrictMode":null,"reactMaxHeadersLength":6000,"httpAgentOptions":{"keepAlive":true},"logging":{"serverFunctions":true,"browserToTerminal":"warn"},"compiler":{},"expireTime":31536000,"staticPageGenerationTimeout":60,"output":"standalone","modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"}},"outputFileTracingRoot":"/home/runner/work/attalabs/attalabs","cacheComponents":false,"cacheLife":{"default":{"stale":300,"revalidate":900,"expire":4294967294},"seconds":{"stale":30,"revalidate":1,"expire":60},"minutes":{"stale":300,"revalidate":60,"expire":3600},"hours":{"stale":300,"revalidate":3600,"expire":86400},"days":{"stale":300,"revalidate":86400,"expire":604800},"weeks":{"stale":300,"revalidate":604800,"expire":2592000},"max":{"stale":300,"revalidate":2592000,"expire":31536000}},"cacheHandlers":{},"experimental":{"appNewScrollHandler":false,"useSkewCookie":false,"cssChunking":true,"multiZoneDraftMode":false,"appNavFailHandling":false,"prerenderEarlyExit":true,"serverMinification":true,"linkNoTouchStart":false,"caseSensitiveRoutes":false,"cachedNavigations":false,"partialFallbacks":false,"dynamicOnHover":false,"varyParams":false,"prefetchInlining":false,"preloadEntriesOnStart":true,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","proxyPrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":3,"memoryBasedWorkersCount":false,"imgOptConcurrency":null,"imgOptTimeoutInSeconds":7,"imgOptMaxInputPixels":268402689,"imgOptSequentialRead":null,"isrFlushToDisk":true,"workerThreads":false,"optimizeCss":false,"nextScriptWorkers":false,"scrollRestoration":false,"externalDir":false,"disableOptimizedLoading":false,"gzipSize":true,"craCompat":false,"esmExternals":true,"fullySpecified":false,"swcTraceProfiling":false,"forceSwcTransforms":false,"largePageDataBytes":128000,"typedEnv":false,"parallelServerCompiles":false,"parallelServerBuildTraces":false,"ppr":false,"authInterrupts":false,"webpackMemoryOptimizations":false,"optimizeServerReact":true,"strictRouteTypes":false,"useTypeScriptCli":false,"viewTransition":false,"removeUncaughtErrorAndRejectionListeners":false,"validateRSCRequestHeaders":false,"staleTimes":{"dynamic":0,"static":300},"reactDebugChannel":true,"serverComponentsHmrCache":true,"staticGenerationMaxConcurrency":8,"staticGenerationMinPagesPerWorker":25,"transitionIndicator":false,"gestureTransition":false,"inlineCss":false,"useCache":false,"globalNotFound":false,"browserDebugInfoInTerminal":"warn","lockDistDir":true,"proxyClientMaxBodySize":10485760,"hideLogsAfterAbort":false,"mcpServer":true,"turbopackFileSystemCacheForDev":true,"turbopackFileSystemCacheForBuild":false,"turbopackInferModuleSideEffects":true,"turbopackPluginRuntimeStrategy":"childProcesses","optimizePackageImports":["lucide-react","date-fns","lodash-es","ramda","antd","react-bootstrap","ahooks","@ant-design/icons","@headlessui/react","@headlessui-float/react","@heroicons/react/20/solid","@heroicons/react/24/solid","@heroicons/react/24/outline","@visx/visx","@tremor/react","rxjs","@mui/material","@mui/icons-material","recharts","react-use","effect","@effect/schema","@effect/platform","@effect/platform-node","@effect/platform-browser","@effect/platform-bun","@effect/sql","@effect/sql-mssql","@effect/sql-mysql2","@effect/sql-pg","@effect/sql-sqlite-node","@effect/sql-sqlite-bun","@effect/sql-sqlite-wasm","@effect/sql-sqlite-react-native","@effect/rpc","@effect/rpc-http","@effect/typeclass","@effect/experimental","@effect/opentelemetry","@material-ui/core","@material-ui/icons","@tabler/icons-react","mui-core","react-icons/ai","react-icons/bi","react-icons/bs","react-icons/cg","react-icons/ci","react-icons/di","react-icons/fa","react-icons/fa6","react-icons/fc","react-icons/fi","react-icons/gi","react-icons/go","react-icons/gr","react-icons/hi","react-icons/hi2","react-icons/im","react-icons/io","react-icons/io5","react-icons/lia","react-icons/lib","react-icons/lu","react-icons/md","react-icons/pi","react-icons/ri","react-icons/rx","react-icons/si","react-icons/sl","react-icons/tb","react-icons/tfi","react-icons/ti","react-icons/vsc","react-icons/wi"],"trustHostHeader":false,"isExperimentalCompile":false},"htmlLimitedBots":"[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight","bundlePagesRouterDependencies":false,"configFileName":"next.config.ts","transpilePackages":["@atta/ui","@attalabs/aeg-core","@attalabs/aeg-forge-state"],"turbopack":{"root":"/home/runner/work/attalabs/attalabs","resolveAlias":{"@atta/ui/components":"../../../packages/ui/generated/vinayaStudio/components.ts"}},"distDirRoot":".next"}
12
+ const nextConfig = {"env":{},"typescript":{"ignoreBuildErrors":false},"typedRoutes":false,"distDir":"./.next","cleanDistDir":true,"assetPrefix":"","cacheMaxMemorySize":52428800,"configOrigin":"next.config.ts","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"poweredByHeader":true,"compress":true,"images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":14400,"formats":["image/webp"],"maximumRedirects":3,"maximumResponseBody":50000000,"dangerouslyAllowLocalIP":false,"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"attachment","localPatterns":[{"pathname":"**","search":""}],"remotePatterns":[],"qualities":[75],"unoptimized":false,"customCacheHandler":false},"devIndicators":{"position":"bottom-left"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"basePath":"","sassOptions":{},"trailingSlash":false,"i18n":null,"productionBrowserSourceMaps":false,"excludeDefaultMomentLocales":true,"reactProductionProfiling":false,"reactStrictMode":null,"reactMaxHeadersLength":6000,"httpAgentOptions":{"keepAlive":true},"logging":{"serverFunctions":true,"browserToTerminal":"warn"},"compiler":{},"expireTime":31536000,"staticPageGenerationTimeout":60,"output":"standalone","modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"}},"outputFileTracingRoot":"/home/runner/work/attalabs/attalabs","cacheComponents":false,"cacheLife":{"default":{"stale":300,"revalidate":900,"expire":4294967294},"seconds":{"stale":30,"revalidate":1,"expire":60},"minutes":{"stale":300,"revalidate":60,"expire":3600},"hours":{"stale":300,"revalidate":3600,"expire":86400},"days":{"stale":300,"revalidate":86400,"expire":604800},"weeks":{"stale":300,"revalidate":604800,"expire":2592000},"max":{"stale":300,"revalidate":2592000,"expire":31536000}},"cacheHandlers":{},"experimental":{"appNewScrollHandler":false,"useSkewCookie":false,"cssChunking":true,"multiZoneDraftMode":false,"appNavFailHandling":false,"prerenderEarlyExit":true,"serverMinification":true,"linkNoTouchStart":false,"caseSensitiveRoutes":false,"cachedNavigations":false,"partialFallbacks":false,"dynamicOnHover":false,"varyParams":false,"prefetchInlining":false,"preloadEntriesOnStart":true,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","proxyPrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":3,"memoryBasedWorkersCount":false,"imgOptConcurrency":null,"imgOptTimeoutInSeconds":7,"imgOptMaxInputPixels":268402689,"imgOptSequentialRead":null,"isrFlushToDisk":true,"workerThreads":false,"optimizeCss":false,"nextScriptWorkers":false,"scrollRestoration":false,"externalDir":false,"disableOptimizedLoading":false,"gzipSize":true,"craCompat":false,"esmExternals":true,"fullySpecified":false,"swcTraceProfiling":false,"forceSwcTransforms":false,"largePageDataBytes":128000,"typedEnv":false,"parallelServerCompiles":false,"parallelServerBuildTraces":false,"ppr":false,"authInterrupts":false,"webpackMemoryOptimizations":false,"optimizeServerReact":true,"strictRouteTypes":false,"useTypeScriptCli":false,"viewTransition":false,"removeUncaughtErrorAndRejectionListeners":false,"validateRSCRequestHeaders":false,"staleTimes":{"dynamic":0,"static":300},"reactDebugChannel":true,"serverComponentsHmrCache":true,"staticGenerationMaxConcurrency":8,"staticGenerationMinPagesPerWorker":25,"transitionIndicator":false,"gestureTransition":false,"inlineCss":false,"useCache":false,"globalNotFound":false,"browserDebugInfoInTerminal":"warn","lockDistDir":true,"proxyClientMaxBodySize":10485760,"hideLogsAfterAbort":false,"mcpServer":true,"turbopackFileSystemCacheForDev":true,"turbopackFileSystemCacheForBuild":false,"turbopackInferModuleSideEffects":true,"turbopackPluginRuntimeStrategy":"childProcesses","optimizePackageImports":["lucide-react","date-fns","lodash-es","ramda","antd","react-bootstrap","ahooks","@ant-design/icons","@headlessui/react","@headlessui-float/react","@heroicons/react/20/solid","@heroicons/react/24/solid","@heroicons/react/24/outline","@visx/visx","@tremor/react","rxjs","@mui/material","@mui/icons-material","recharts","react-use","effect","@effect/schema","@effect/platform","@effect/platform-node","@effect/platform-browser","@effect/platform-bun","@effect/sql","@effect/sql-mssql","@effect/sql-mysql2","@effect/sql-pg","@effect/sql-sqlite-node","@effect/sql-sqlite-bun","@effect/sql-sqlite-wasm","@effect/sql-sqlite-react-native","@effect/rpc","@effect/rpc-http","@effect/typeclass","@effect/experimental","@effect/opentelemetry","@material-ui/core","@material-ui/icons","@tabler/icons-react","mui-core","react-icons/ai","react-icons/bi","react-icons/bs","react-icons/cg","react-icons/ci","react-icons/di","react-icons/fa","react-icons/fa6","react-icons/fc","react-icons/fi","react-icons/gi","react-icons/go","react-icons/gr","react-icons/hi","react-icons/hi2","react-icons/im","react-icons/io","react-icons/io5","react-icons/lia","react-icons/lib","react-icons/lu","react-icons/md","react-icons/pi","react-icons/ri","react-icons/rx","react-icons/si","react-icons/sl","react-icons/tb","react-icons/tfi","react-icons/ti","react-icons/vsc","react-icons/wi"],"trustHostHeader":false,"isExperimentalCompile":false},"htmlLimitedBots":"[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight","bundlePagesRouterDependencies":false,"configFileName":"next.config.ts","transpilePackages":["@atta/ui","@attalabs/aeg-core","@attalabs/aeg-forge-state"],"outputFileTracingIncludes":{"/api/coherence":["../../../node_modules/@attalabs/aeg-core/bin/verify-coherence.ts"]},"turbopack":{"root":"/home/runner/work/attalabs/attalabs","resolveAlias":{"@atta/ui/components":"../../../packages/ui/generated/vinayaStudio/components.ts"}},"distDirRoot":".next"}
13
13
 
14
14
  process.env.__NEXT_PRIVATE_STANDALONE_CONFIG = JSON.stringify(nextConfig)
15
15
 
@@ -1,292 +0,0 @@
1
- ---
2
- sidebar_title: Coordination
3
- ---
4
- # Coordination — How to Work With This System
5
-
6
- **This file lives in the repo at `aeg-root/coordination.md`.**
7
- **All agents read this at session start.**
8
-
9
- This is the coordination contract for **this repo's instance** of the AEG operating model. (The model itself is neutral and lives in `state-machine.md`, `aeg-manual-flow.md`, `tranche-model.md`, the role docs, and the `aeg` skill; *this* file fills in the repo-specific parts: the names, the products, the tools in use, the house communication style. A different repo adopting AEG would keep the model and replace this file's specifics.)
10
-
11
- Dani works with multiple agents across a chat/planning surface and a coding-agent surface. This file tells each agent who it is, how to orient, and what the rules are.
12
-
13
- **The model described here is Agentic Execution Governance (AEG)** — the v3 operational model. AEG is a small set of accountable roles (Principal, Planner / Brief Author, Developer, Reviewer, Archivist) coordinating AI agents through briefs, blocking escalation, and independent review. It is *not* "project management" (there is no product plan, timeline, or resource tracking here — that stays in the company's tool) — it is governance plus orchestration of delegated AI execution.
14
-
15
- **AEG is forge-native, orchestrator-independent.** It depends on a Git forge (GitHub) as its source of truth for execution state — task status is *derived* from Issue/branch/PR/merge state, never stored. It does **not** depend on any orchestration tool. The governance half (authority, ratification, review) lives in this repo, not in any tool.
16
-
17
- ---
18
-
19
- ## Reading order for new sessions
20
-
21
- If you are starting a fresh session and need to orient:
22
-
23
- 1. `aeg-root/coordination.md` — this file (start here)
24
- 2. `aeg-root/state-machine.md` — the constitution; artifact states, roles, permissions, decision schema
25
- 3. `aeg-root/roles/{your-role}.md` — Planner / Brief Author (incl. Planner & Brief Author modes), Developer, Principal, Reviewer, Security, or Archivist
26
- 4. `aeg-root/tranche-model.md` — the tranche model: tasks-as-Issues, forge-derived status, the thin topology file, conflicts (read when planning or executing)
27
- 5. **Per-project state (pinned Issues)** — what is true right now, per project (one pinned Issue each, found via the repo's native Pinned Issues view, not a memorized number) plus the ecosystem-wide bucket (every project with no dedicated folder, plus cross-project facts, its own pinned Issue). Non-derivable operational facts; current focus pointer.
28
- 6. **Derive current execution state from the forge** — see the "Session-start forge queries" section below
29
- 7. `aeg-root/tranches/<name>.md` — the current tranche's task topology (the plan); live status is queried from the forge, not read here. **Post-cutover:** most active tranches no longer have this file at all — task→Issue topology derives straight from the forge (a Milestone + `tranche:<slug>`-labeled Issues). **No active tranche carries this file at all today** — the last tracked exception's file was deleted once its backfill completed (`tranche-model.md` §4); `completed/` tranches keep theirs permanently, by design, and `check-no-disk-state.ts` now CI-blocks adding a new active one.
30
- 8. **Lessons log (pinned Issue)** — calibration lessons + anti-patterns, one comment per lesson (read when authoring briefs or post-mortems)
31
-
32
- The AEG model front door is the **`aeg`** skill (the model in one read) → the **`aeg-roles`** skill (routes you to your role doc). Load those first; this file is the repo-specific companion.
33
-
34
- ### One AEG model, at the root. Always orient from there.
35
-
36
- There is exactly one AEG model in this monorepo, at the repo-root `aeg-root/` (constitution, flow, roles, skills, the project registry `projects.md`). It exists nowhere else. **Any agent, executing any task for any project — an app, a package, a library, the monorepo itself — orients from `aeg-root/` first:** it reads the constitution, the role doc, and the active tranche there. It never expects a per-project copy of the model.
37
-
38
- Living **state** is held in pinned forge Issues (lessons, per-project operational state): one root ecosystem-wide pinned Issue (covering every project with no dedicated folder, plus cross-project facts) and one pinned Issue per project that has its own folder. A task updates the pinned state Issue of each project it touches (one for a single-project task, several for a cross-project task — resolve which project via `.vinaya/projects.md`, then which Issue via this list or `gh issue search`). This state layer holds facts only — never the model — which is what forces every agent back to `aeg-root/` for the rules.
39
-
40
- For deeper context on the operational model design:
41
- - `aeg-root/aeg-manual-flow.md` — running the flow by hand (the operator's guide)
42
- - `aeg-root/process.md` — the thirteen-phase walkthrough from idea to merged code
43
- - `aeg-root/diagrams/` — process and architecture diagrams (note: being brought in line with the forge-derived-status model; if a diagram shows agents writing status, the prose docs are canonical)
44
-
45
- Do not generate strategy, plan a tranche, or author briefs until you have read `state-machine.md` and the spec for any project in scope.
46
-
47
- ### Session-start forge queries — deriving current state
48
-
49
- `now.md` is retired. Current execution state is **derived from the forge**, not read from a file. Run these queries to answer the three orientation questions:
50
-
51
- **"What's active?"** — open Issues with an `tranche:<slug>` label, or check open PRs:
52
- ```bash
53
- gh issue list --label "tranche:<slug>" --state open
54
- gh pr list --state open
55
- ```
56
-
57
- **"What's next?"** — open Issues in the current tranche that have no open PR (unassigned branch):
58
- ```bash
59
- gh issue list --label "tranche:<slug>" --state open --assignee ""
60
- # Then for each: gh pr list --state open | grep "task/<slug>/"
61
- ```
62
-
63
- **"What's blocked?"** — Issues with the `aeg:blocked` label:
64
- ```bash
65
- gh issue list --label "aeg:blocked" --state open
66
- ```
67
-
68
- **"What's the current focus?"** — read the ecosystem pinned state Issue's "Current focus" section and the active tranche file at `aeg-root/tranches/<name>.md`.
69
-
70
- **"What merged recently?"** — `gh pr list --state merged --limit 20`
71
-
72
- No brief, no audit finding, no "next steps" recommendation is valid without this forge check. Forge state > file state > memory. Always.
73
-
74
- ---
75
-
76
- ## The coordination model — four truth domains
77
-
78
- Every fact lives in exactly one place (see `tranche-model.md` §1):
79
-
80
- - **The Git forge** (Issue / branch / PR / review / merge state) = **all live execution status, derived not stored.** Authoritative for task status and merge state. A task *is* a forge Issue.
81
- - **Repo** = code, specs, skills, PM docs, role docs, the thin tranche topology files, design decisions. Git-tracked, long-lived, changed by commits/PRs. The source of truth for *plan and governance* (not live status).
82
- - **The PR body** = the just-in-time brief — a task's full execution context. The brief is pasted here at PR-open, never committed separately, never in the Issue.
83
- - **Local filesystem** = orchestration-tool runtime state, worktrees, dev servers. Ephemeral. Never canonical.
84
-
85
- Conversation logs / thinking are not artifacts; do not cite as authority.
86
-
87
- ### PM files that change frequently
88
-
89
- | File | Purpose | Update cadence |
90
- |------|---------|----------------|
91
- | `aeg-root/coordination.md` | This file. Rules, names, how to work. | Rare (system changes only) |
92
- | Per-project state (pinned Issue) | Non-derivable operational facts: known production issues, env-var requirements, phase intent, pending manual ops, current-focus pointer. | Whenever state changes |
93
- | `aeg-root/tranches/<name>.md` | The current tranche's task topology (edges, grouping). Plan only — no status. | At plan time (Planner) |
94
- | Lessons log (pinned Issue) | Calibration lessons + anti-patterns. One new comment per lesson. | Monthly review |
95
- | `docs-index.md` | Discovery map of repo content. Auto-generated. | When repo files added/removed/renamed |
96
-
97
- > **`now.md` is retired.** Active work, blocked tasks, and next candidates are derived from the forge (see "Session-start forge queries" above). The forge is the single source of truth for what is happening; the per-project pinned state Issue holds what the forge cannot derive.
98
-
99
- The roadmap is **not** an AEG file — it lives in the company's tool (or, for solo work, in the per-project backlogs `apps/<project>/specs/<project>-backlog.md`, which are reference docs out of the flow). The old global `roadmap.md` is retired, and the monorepo-wide `specs/ecosystem-backlog.md` it once sat beside was deleted with the rest of the stale AEG research — cross-cutting items are cut as backlog Issues instead. **Backlog convention:** a unit's *plan* lives in its `specs/` (`apps/<project>/specs/<project>-backlog.md` per project); a unit's *flow + governance* lives in the root `aeg-root/` (model, exists once); its *living state* lives on the per-project pinned Issue (the old per-unit `aeg-project/` state folder is retired).
100
-
101
- ### What lives in the repo
102
-
103
- Everything else. All skills (canonical home `aeg-root/skills/*/SKILL.md`, with a generated agent-surface view e.g. `.claude/skills/`), agent definitions, specs (`apps/*/specs/*.md`), role docs, the state machine, this file. The index (`docs-index.md`) lists where things are.
104
-
105
- ---
106
-
107
- ## The names — where the host repo defines them
108
-
109
- Every session needs a shared vocabulary for the products, brands, and domains the work touches. **That vocabulary is the host repo's, not this model's**, so it is not defined here.
110
-
111
- An earlier revision carried one repo's product table, brand architecture, and naming conventions inline, marked as instance content. Marking it was not enough: a repo adopting this model still received another organization's product names, domains, and house naming rules as part of its own doctrine. The section is now a pointer rather than a payload.
112
-
113
- **Where to look, in order:** the project registry (`.vinaya/projects.md` — the authority for valid `Project:` values, and the only names any gate resolves against), then the repo's own root guidance file for brand and naming conventions. A repo with a single project needs neither: one project, no disambiguation, no registry.
114
-
115
- Nothing in this model resolves a product name. Names route work to specs and state; the routing is registry-driven, and the registry is the adopter's.
116
-
117
- ---
118
-
119
- ## Session start protocol
120
-
121
- Role is determined by environment and context — not by which agent you are. Read `state-machine.md` Section 1 for the role determination rules.
122
-
123
- ### If you are the Planner / Brief Author (a chat/planning surface, talking strategy/planning)
124
-
125
- 1. **Read `state-machine.md`** — confirm the authority matrix and decision schema.
126
- 2. **Read `roles/planner.md` or `roles/brief-author.md`** — confirm which of the two you are. Planning a tranche is the Planner; authoring one task's brief is the Brief Author.
127
- 3. **Read the ecosystem pinned state Issue** — orient on current ecosystem state, known production issues, and pending manual ops; read the relevant per-project pinned Issue too if scoped to one project. Read the current `tranches/<name>.md` for in-flight task topology.
128
- 4. **Derive live execution state from the forge** — run the session-start forge queries above: open Issues by `tranche:<slug>`, open PRs, `aeg:blocked` labels.
129
- 5. **Check the `needs:principal-input` label** — any labeled Issues/PRs for today's window? (`gh issue list --label needs:principal-input --state open`, `gh pr list --label needs:principal-input --state open` retired the `ratification-queue.md` file in favor of this label query — historical entries preserved on the pinned ratification Issue.)
130
- 6. **Determine the project in scope** — apply the spec-check gate (below) before anything substantive.
131
-
132
- ### If you are the Developer (a coding-agent surface, executing a brief)
133
-
134
- 1. **Read the brief completely** before writing any code.
135
- 2. **Read `roles/developer.md`** — confirm the entry gate, tier, stop conditions, verification checklist.
136
- 3. **Check the dispatch gates against the forge** — is every `depends-on` task's PR merged? Is any `conflicts-with` sibling's PR open? If a gate isn't satisfied, STOP (the task serializes).
137
- 4. **Create the worktree** — Step 0, branch `task/<tranche>/<n>` from `origin/main`. Do this before anything else:
138
- ```
139
- git worktree add .worktrees/task/<tranche>/<n> -b task/<tranche>/<n> origin/main && cd .worktrees/task/<tranche>/<n> && bun install --frozen-lockfile --silent
140
- ```
141
- The `bun install` step initializes Husky, which fires the post-checkout hook (`tools/sync-env-from-main.sh`) to symlink `.env*.local` files from the main checkout.
142
- 5. **Run remaining pre-flight** — `git status`, `git log --oneline -3`, confirm the branch.
143
- 6. **Identify which skills apply** — the brief's scope determines which skills to invoke.
144
- 7. **Do not begin implementation** until gates are clear, worktree exists, pre-flight passes, skill-check is satisfied.
145
-
146
- ### If you are the Reviewer or Security agent (reviewing an open PR)
147
-
148
- You were invoked specifically to review a PR. You run with fresh context on purpose; you did not write this code.
149
-
150
- 1. **Read your role doc** — `roles/reviewer.md` (code) or `roles/security.md` (security). It is your full spec, including the entry-gate refusals.
151
- 2. **Read the brief — in the PR body** (not the Issue; the Developer pastes the brief into the PR description). If there's no open PR, or no brief in the PR body, refuse per your role doc.
152
- 3. **Read the PR diff** — `git diff main...HEAD` (stat first, then substantive files).
153
- 5. **Emit the VERDICT block** from your role doc. Do not edit code. Do not merge. Do not write status. Route `[ESCALATE]` findings to Planner/Principal.
154
-
155
- ### If you are the Archivist (closing out a merged PR)
156
-
157
- 1. **Confirm the PR is merged** — your only hard precondition (forge-derived). If not merged, refuse.
158
- 2. **Read `roles/archivist.md`** — the close-out checklist.
159
- 3. **Work the checklist** — Issue closed, docs coherent, per-project pinned state Issue updated for every project the task listed (remove stale operational notes; `now.md` no longer exists), provenance block posted to the merged PR. Flag (don't perform) orphaned branches and worktree removal. Write no task status — the merge is the status.
160
-
161
- ### Mandatory forge check (before any brief, audit, or recommendation)
162
-
163
- Run or fetch before producing output that depends on knowing what's in flight:
164
- - Open Issues (current tranche): `gh issue list --label "tranche:<slug>" --state open`
165
- - Open PRs: `gh pr list --state open`
166
- - Blocked Issues: `gh issue list --label "aeg:blocked" --state open`
167
- - Recent merges: `gh pr list --state merged --limit 20`
168
-
169
- No brief, no audit finding, no "next steps" recommendation is valid without this.
170
- Forge state > file state > memory. Always.
171
-
172
- ### Hard rule — the spec-check gate
173
-
174
- If Dani asks a strategic, architectural, or product-shape question about a named product, and you have not read the specs for that product, **stop and read them first.** No "thinking out loud first." Applies to the Planner and the Brief Author alike. Does NOT apply when executing a brief (the brief specifies scope; do not expand it).
175
-
176
- ---
177
-
178
- ## Ratification windows
179
-
180
- 1-2 daily sessions where the Principal resolves items requiring his final authority. there is no queue file — the Brief Author applies the `needs:principal-input` label to whichever Issue/PR needs ratification and batches the labeled set (`gh issue list --label needs:principal-input`, `gh pr list --label needs:principal-input`) before each window. Historical entries predating this mechanism are preserved on the pinned ratification Issue.
181
-
182
- **Batches at windows:** Type 1 decisions (irreversible; PENDING until window); Tier 3 PR merges; `severity: product` escalations; PENDING Type 2 decisions.
183
-
184
- **Does NOT wait:** Type 2 decisions the Brief Author makes (ACTIVE immediately); Tier 0/1 PR merges (after CI + Brief Author spec review); `severity: execution`/`strategy` escalations (Brief Author handles); already-ratified items.
185
-
186
- **Brief Author responsibility:** before each window, surface PENDING items; after, mark RESOLVED with the Principal's action and date.
187
-
188
- ---
189
-
190
- ## Spec naming convention
191
-
192
- Locked. Spec filenames are `{product}-spec.md` or `{component}-spec.md` — no `-v0`/`-v1`/`-draft`/date suffixes. Version state lives in the file's `Status:` block (`draft` / `target` / `ratified` / `retired`), not the filename. Renaming to add a version suffix requires a lock challenge to.
193
-
194
- ---
195
-
196
- ## Coordination rules — keeping sessions in sync
197
-
198
- ### Every repo-file change goes through a worktree + PR — no direct commits to `main`
199
-
200
- **Universal rule, every role.** Any change to a repo-tracked file — code, specs, skills, role docs, the tranche topology — reaches `main` through a worktree branch + PR + green merge. **No role commits or pushes directly to `main`.** This applies to the Planner editing the tranche file just as much as the Developer editing code: "I only touched a doc" is not an exemption. The drift that produced this rule was a plan commit landing on `main` with no worktree and nothing stopping it.
201
-
202
- This is **mechanically enforced**, not merely asked:
203
- - **This repo has no local main-branch guard and no agent-side merge interception.** The managed `.git/hooks/pre-commit`/`pre-push` blocks run the `vinaya check` suite (shared across every linked worktree via git's common hooks directory), but nothing locally refuses a commit on `main` or an agent merge of a red PR. What holds the invariants here: the required `vinaya review gate` check plus branch protection make a red merge unmergeable on the forge side, and a stray direct push to `main` is detected after the fact by the ring-2 `direct-main-push` audit (the `vinaya/direct-main-push` label). (The attalabs reference implementation additionally refuses these locally — per-worktree main-guards in its hooks and a session-level merge-gate hook that denies any merge path unless the PR is all-green.)
204
-
205
- The green-merge invariant's forge half is a GitHub setting: attalabs pins it with a repository ruleset requiring its gate checks with `bypass_actors: []`; this repo's equivalent is branch protection marking the `vinaya-checks` and review-gate checks required — `vinaya init` prints the enabling command and `vinaya doctor` reports its absence. The exception path is the same as everywhere: a `Lock`/override is a Principal action, not an agent one.
206
-
207
- The only thing a non-Developer role does *not* route through a worktree is a pure forge action (cutting an Issue, posting a comment, merging via the gate) — those touch the forge, not repo files. Every repo *file* edit goes through the worktree + PR.
208
-
209
- ### When state changes, update the pinned state Issue
210
-
211
- State changes: a project phase advances, an app ships/scaffolds, auth/DNS config changes, a known production issue is resolved, a pending manual op is completed. The Brief Author updates the relevant project's pinned state Issue (one per project, or the ecosystem-wide one) directly (editing an Issue body is a forge action, not a repo-file change — it does not go through a worktree/PR). For Tier 3 work affecting the state Issue, note it in the code PR's body too.
212
-
213
- Active work, next candidates, and blocked tasks are **derived from the forge** — they are never written to a file. (`now.md` is retired.)
214
-
215
- ### When the plan changes, update the appropriate file
216
-
217
- - **The execution plan changes** (a task's edges, a new task, tranche scope) → the current `tranches/<name>.md` (Planner, at plan time). Live task *status* is never written — it's derived from the forge.
218
- - **Held/future project items change** → the relevant per-project backlog (`apps/<project>/specs/<project>-backlog.md`) — out of the flow.
219
- - **Lesson learned / anti-pattern** → post a new comment on the pinned lessons Issue — never edit an existing comment
220
-
221
- ### When repo structure changes, regenerate `docs-index.md`
222
-
223
- Run `bun docs:index`, commit the result. On add/remove/rename. Content changes within existing files do not require regeneration.
224
-
225
- ### When decisions are made, log them immediately
226
-
227
- State the decision in the pull request that carries the work, during the conversation. Announce: "I'm treating this as a Type [1/2] decision." Do not defer to session end.
228
-
229
- ---
230
-
231
- ## What goes where — quick reference
232
-
233
- | If you're updating... | Where |
234
- |----------------------|-------|
235
- | A skill / agent definition | Repo only (skills: canonical in `aeg-root/skills/`, generated view in `.claude/skills/`) |
236
- | A project spec, ecosystem vision, naming decision | Repo only |
237
- | Non-derivable operational facts (production issues, env-var requirements, phase intent, pending manual ops, current-focus pointer) | Per-project pinned Issue, one per project, plus one covering ecosystem-wide facts |
238
- | The execution plan (task topology, edges) | `aeg-root/tranches/<name>.md` |
239
- | Held / future project items | `apps/{project}/specs/{project}-backlog.md` (per project); cross-cutting items are cut as backlog Issues |
240
- | Completed work history | `git log` / merged-PR history (redundant with a committed changelog, so none is kept) |
241
- | Calibration lessons + anti-patterns | Pinned lessons Issue, one new comment per lesson |
242
- | Items awaiting Principal ratification | `needs:principal-input` label on the relevant Issue/PR; historical record on the pinned ratification Issue |
243
- | Live task status (what's active, blocked, next) | **Nowhere — derived from the forge** (`gh issue list --label "tranche:<slug>"`, `gh pr list`, Issues view) |
244
- | Adding/removing/renaming a repo file | Repo + `bun docs:index` |
245
- | Fundamental coordination rules | This file |
246
-
247
- ---
248
-
249
- ## Anti-patterns
250
-
251
- - ❌ Reading or writing `roadmap.md` — it's retired; the execution plan is the tranche file, the product roadmap is the company's tool / backlogs (`apps/*/specs/*-backlog.md`)
252
- - ❌ Putting a backlog anywhere but a `specs/` folder — the plan lives in `specs/`; `aeg-root/` is the model, flow + governance only, and living state is the per-project pinned Issue
253
- - ❌ Writing task status anywhere (a file, the tranche topology, an Issue field) — status is derived from the forge; storing it recreates the racing status model the design eliminated
254
- - ❌ Adding execution metadata (status, PR #, dates) to the tranche topology file — it is plan topology only (`tranche-model.md` §9)
255
- - ❌ Putting the brief in the Issue — the brief is just-in-time and lives in the PR body; the Issue is task identity + metadata only
256
- - ❌ Putting planning metadata (priority, estimates, points) on an Issue — that's the company's roadmap, not AEG
257
- - ❌ Building a dynamic conflict scanner — declare conflicts conservatively and serialize (`tranche-model.md` §9)
258
- - ❌ Putting tactical day-to-day plans in project specs (commit churn)
259
- - ❌ Pretending to have read a spec that isn't in context — ask for it by exact path, or read it from the forge
260
- - ❌ Restating the host repo's brand, namespace, or product-naming rules here — they belong to the adopting repo, not to this model
261
- - ❌ Letting the Developer review its own work — review/security passes are separate fresh-context invocations
262
- - ❌ Generating strategy or planning a tranche before reading the specs (spec-check gate)
263
- - ❌ Adding version suffixes to spec filenames (locked)
264
- - ❌ Making a Type 1 decision in the Brief Author's absence without flagging PENDING
265
- - ❌ Logging decisions at session end instead of at the moment of decision
266
- - ❌ Letting PENDING items accumulate without surfacing them at the next window
267
-
268
- ---
269
-
270
- ## Communication style with Dani
271
-
272
- - Terse. No preamble.
273
- - No time-of-day, energy, or wellness framing.
274
- - No reflexive caveats unless risk is concrete.
275
- - Direct recommendations, not balanced both-sides answers.
276
- - Match length to substance.
277
- - Don't repeat back what Dani said.
278
- - Push back when warranted. Don't manufacture criticism when a position is sound.
279
- - Diagnose before iterating — find root cause before proposing fixes.
280
- - Project files are authoritative when they conflict with memory.
281
-
282
- ---
283
-
284
- ## Multi-agent context
285
-
286
- Dani works with multiple AI collaborators simultaneously: Claude (multiple sessions), Gemini, Grok, DeepSeek, ChatGPT. Dani is always the Principal.
287
-
288
- When other AI outputs are pasted in, Claude responds as the adversarial reviewer / Critic. Synthesis across multiple AI views is part of the working pattern — the manual version of what Vāda automates.
289
-
290
- The AEG model formalizes this: Principal → Planner → Brief Author → Developer → Reviewer + Security → merge → Archivist. The Brief Author routes escalations by severity. Agents do not make final calls.
291
-
292
- **Tooling note (this repo, May 2026):** GitHub MCP may be available via OAuth in fresh conversations — prefer it over paste-back for reading repo content and creating Issues/PRs. The coding-agent surface has direct filesystem access to the worktree. Self-hosted MCP servers with bearer-token auth (e.g. Vāda's hosted MCP) work via a coding-agent CLI, not via the chat connector broker. An orchestration tool may bind the same conversational surface (list active tasks, reply to a blocked task) — a convenience of whatever tool is in use, never part of the model.
@@ -1,3 +0,0 @@
1
- module.exports=[902157,(a,b,c)=>{b.exports=a.x("node:fs",()=>require("node:fs"))},750227,(a,b,c)=>{b.exports=a.x("node:path",()=>require("node:path"))},522734,(a,b,c)=>{b.exports=a.x("fs",()=>require("fs"))},874533,(a,b,c)=>{b.exports=a.x("node:child_process",()=>require("node:child_process"))},812057,(a,b,c)=>{b.exports=a.x("node:util",()=>require("node:util"))},500874,(a,b,c)=>{b.exports=a.x("buffer",()=>require("buffer"))},263598,a=>{"use strict";a.s(["ProjectsSubBar",()=>b]);let b=(0,a.i(211857).registerClientReference)(function(){throw Error("Attempted to call ProjectsSubBar() from the server but ProjectsSubBar is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/apps/vinaya-studio/web/src/app/studio/projects/ProjectsSubBar.tsx <module evaluation>","ProjectsSubBar")},678268,a=>{"use strict";a.s(["ProjectsSubBar",()=>b]);let b=(0,a.i(211857).registerClientReference)(function(){throw Error("Attempted to call ProjectsSubBar() from the server but ProjectsSubBar is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/apps/vinaya-studio/web/src/app/studio/projects/ProjectsSubBar.tsx","ProjectsSubBar")},234706,a=>{"use strict";a.i(263598);var b=a.i(678268);a.n(b)},748173,a=>{"use strict";var b=a.i(907997);a.i(819365);var c=a.i(538586),d=a.i(234706);async function e({children:a}){let f=await (0,c.readRegistry)();return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(d.ProjectsSubBar,{projects:f}),(0,b.jsx)("div",{className:"mx-auto max-w-4xl pt-8",children:a})]})}a.s(["default",0,e])},571261,a=>{a.n(a.i(748173))}];
2
-
3
- //# sourceMappingURL=%5Broot-of-the-server%5D__1rku4gz._.js.map
@@ -1 +0,0 @@
1
- (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,441468,e=>{"use strict";var t=e.i(19810),r=e.i(9963);e.s(["Select",()=>r.Select,"SelectContent",()=>t.SelectContent,"SelectGroup",()=>r.SelectGroup,"SelectItem",()=>r.SelectItem,"SelectLabel",()=>r.SelectLabel,"SelectScrollDownButton",()=>r.SelectScrollDownButton,"SelectScrollUpButton",()=>r.SelectScrollUpButton,"SelectSeparator",()=>r.SelectSeparator,"SelectTrigger",()=>r.SelectTrigger,"SelectValue",()=>r.SelectValue])},915215,e=>{"use strict";var t=e.i(575360),r=e.i(359607);e.s(["ToastProvider",()=>t.ToastProvider,"useToastContext",()=>r.useToastContext])},102773,e=>{"use strict";let t=(0,e.i(456420).default)("funnel",[["path",{d:"M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z",key:"sc7q7i"}]]);e.s(["Filter",0,t],102773)},659220,e=>{"use strict";var t=e.i(843476);e.i(207530);var r=e.i(929570),s=e.i(186506),a=e.i(167012),l=e.i(102773),n=e.i(263676),i=e.i(271645),c=e.i(61575);let o={ready:"Ready","in-flight":"In-flight","in-review":"In review","changes-requested":"Changes requested",blocked:"Blocked",backlog:"Backlog"},d=["in-review","changes-requested","in-flight","ready","blocked","backlog"],u="tasks-filter-heading";e.s(["TasksPanel",0,function({tasks:e}){let[h,g]=(0,i.useState)(new Set),m=(0,i.useMemo)(()=>[...e].sort((e,t)=>d.indexOf(e.category)-d.indexOf(t.category)),[e]),x=(0,i.useMemo)(()=>d.filter(e=>m.some(t=>t.category===e)),[m]),f=(0,i.useMemo)(()=>0===h.size?m:m.filter(e=>h.has(e.category)),[m,h]);return(0,t.jsxs)("div",{className:"space-y-3",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(l.Filter,{className:"size-3.5 shrink-0 text-muted-foreground","aria-hidden":!0}),(0,t.jsx)("h2",{id:u,className:"font-mono text-xs uppercase tracking-wider text-muted-foreground",children:"Filter by"})]}),(0,t.jsxs)("div",{role:"group","aria-labelledby":u,className:"flex flex-wrap items-center gap-1.5",children:[x.map(e=>{let r=h.has(e);return(0,t.jsx)(s.Button,{type:"button",variant:r?"default":"outline",size:"sm",onClick:()=>g(t=>{let r=new Set(t);return r.has(e)?r.delete(e):r.add(e),r}),"aria-pressed":r,className:`h-7 font-mono text-xs ${r?"border-primary bg-accent text-accent-foreground hover:bg-accent/90":"text-muted-foreground"}`,children:o[e]},e)}),h.size>0&&(0,t.jsxs)(s.Button,{type:"button",variant:"ghost",size:"sm",className:"h-7 gap-1 font-mono text-xs text-muted-foreground",onClick:()=>g(new Set),children:[(0,t.jsx)(n.X,{className:"size-3.5","aria-hidden":!0}),"Clear"]})]}),0===f.length?(0,t.jsx)("p",{className:"pt-2 font-sans text-xs text-muted-foreground/70",children:"No tasks match these filters."}):(0,t.jsx)("div",{className:"divide-y divide-border pt-2 lg:space-y-2 lg:divide-y-0",children:f.map(e=>{let s=`${e.trancheSlug??"backlog"}-${e.taskId}`;return(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2 py-2 font-mono text-xs lg:py-0",children:[(0,t.jsx)("span",{className:"min-w-12 shrink-0 text-muted-foreground tabular-nums",children:null!=e.issue&&(e.issueUrl?(0,t.jsxs)("a",{href:e.issueUrl,target:"_blank",rel:"noreferrer",className:"hover:text-primary hover:underline",children:["#",e.issue]}):`#${e.issue}`)}),(0,t.jsx)(r.Badge,{variant:"outline",className:`shrink-0 font-mono text-xs ${e.badge.badgeClass}`,title:e.badge.title,children:e.badge.label}),(0,t.jsx)("span",{className:"text-card-foreground lg:min-w-0 lg:flex-1",children:e.title}),e.trancheSlug&&(0,t.jsx)("span",{className:"shrink-0 text-muted-foreground/70 lg:pl-2",children:e.trancheHref?(0,t.jsx)(a.NextLink,{variant:"unstyled",href:e.trancheHref,className:"hover:text-primary hover:underline",children:e.trancheSlug}):(0,t.jsx)("span",{className:"cursor-help",title:c.NO_BOARD_REASON,children:e.trancheSlug})})]},s)})})]})}])}]);
@@ -1 +0,0 @@
1
- (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,471629,481139,e=>{"use strict";var s=e.i(843476),a=e.i(853138);function t({scope:e,status:n,detail:r}){if("ok"===n.kind)return null;if("unreachable"===n.kind)return(0,s.jsxs)("div",{className:"flex items-start gap-2 rounded-md border border-warning/40 bg-warning/10 px-3 py-2 text-warning",children:[(0,s.jsx)(a.AlertTriangle,{className:"size-4 shrink-0 translate-y-0.5 text-warning","aria-hidden":!0}),(0,s.jsxs)("p",{className:"font-sans text-xs text-warning",children:["Live forge state unavailable — GitHub could not be reached."," ",r??"Showing archived/legacy data only; active tranches cannot be listed right now."]})]});let i="both"===e?"tranches":`${e} tranches`,c=n.failed.map(e=>e.slug).join(", ");return(0,s.jsxs)("div",{className:"flex items-start gap-2 rounded-md border border-warning/40 bg-warning/10 px-3 py-2 text-warning",children:[(0,s.jsx)(a.AlertTriangle,{className:"size-4 shrink-0 translate-y-0.5 text-warning","aria-hidden":!0}),(0,s.jsxs)("p",{className:"font-sans text-xs text-warning",children:["Live forge state partially unavailable — ",n.failed.length," of ",n.total," ",i," could not be loaded (",c,"). Shown counts exclude them."]})]})}e.s(["ForgeBanners",0,function({forge:e}){return"unreachable"===e.active.kind&&"unreachable"===e.archived.kind?(0,s.jsx)(t,{scope:"both",status:e.active}):(0,s.jsxs)("div",{className:"space-y-2",children:["ok"!==e.active.kind&&(0,s.jsx)(t,{scope:"active",status:e.active}),"ok"!==e.archived.kind&&(0,s.jsx)(t,{scope:"archived",status:e.archived})]})}],471629),e.i(207530);var n=e.i(336583),r=e.i(167012);let i=(0,e.i(456420).default)("arrow-right",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]);var c=e.i(271645),l=e.i(61575);function d({counts:e,archived:a}){let{total:t,done:n,ongoing:r,todo:i,blocked:l,dropped:o,incoherent:h,backlog:u,forgeAvailable:x}=e;if(!x)return(0,s.jsxs)("p",{children:[t," task",1===t?"":"s"]});if("active"!=(a?"archived":e.forgeAvailable&&e.done>0&&e.done+e.dropped===e.total?"awaiting-archive":"active"))return(0,s.jsx)("span",{className:"inline-block rounded border border-success/50 px-1.5 py-0.5 font-mono text-xs font-medium uppercase tracking-wider text-success",children:"done"});let g=t-o,m=g>0?Math.round(n/g*100):0,p=[{key:"done",label:`${n} done`,count:n,className:"text-success"},{key:"ongoing",label:`${r} active`,count:r,className:"text-primary"},{key:"todo",label:`${i} to do`,count:i},{key:"blocked",label:`${l} blocked`,count:l,className:"text-warning"},{key:"dropped",label:`${o} dropped`,count:o,className:"text-muted-foreground/70"},{key:"incoherent",label:`${h} incoherent`,count:h,className:"text-destructive"},{key:"backlog",label:`${u} backlog`,count:u,className:"text-muted-foreground/70"}].filter(e=>e.count>0);return(0,s.jsxs)("div",{className:"space-y-1",children:[(0,s.jsx)("div",{className:"h-1 overflow-hidden rounded-full bg-muted",children:(0,s.jsx)("div",{className:"h-full rounded-full bg-success",style:{width:`${m}%`}})}),(0,s.jsxs)("div",{className:"flex items-center justify-between",children:[(0,s.jsx)("span",{children:p.map((e,a)=>(0,s.jsxs)(c.Fragment,{children:[a>0&&" · ",(0,s.jsx)("span",{className:e.className,children:e.label})]},e.key))}),(0,s.jsxs)("span",{children:[m,"%"]})]})]})}e.s(["TrancheCard",0,function({tranche:e,href:a,showProjects:t=!1}){let c="group block",o=(0,s.jsxs)(n.Card,{children:[(0,s.jsx)(n.CardHeader,{className:"pb-2",children:(0,s.jsxs)(n.CardTitle,{className:"flex items-center justify-between font-serif text-xl text-card-foreground",children:[(0,s.jsx)("span",{children:e.name}),a?(0,s.jsx)(i,{className:"size-4 shrink-0 text-muted-foreground transition-transform group-hover:translate-x-0.5 group-hover:text-primary"}):null]})}),(0,s.jsxs)(n.CardContent,{className:"space-y-2 font-mono text-xs text-muted-foreground",children:[t&&e.projects.length>0&&(0,s.jsxs)("p",{children:["projects · ",e.projects.join(" · ")]}),!a&&(0,s.jsx)("p",{className:"font-sans text-xs text-muted-foreground/70",children:l.NO_BOARD_REASON}),e.goal&&(0,s.jsx)("p",{className:"line-clamp-2 font-sans text-xs",children:e.goal}),(0,s.jsx)(d,{counts:e.taskCounts,archived:e.archived})]})]});return a?(0,s.jsx)(r.NextLink,{variant:"unstyled",href:a,className:c,children:o}):(0,s.jsx)("div",{className:`${c} cursor-help`,title:l.NO_BOARD_REASON,children:o})}],481139)},993439,e=>{"use strict";var s=e.i(843476);e.i(207530);var a=e.i(829834),t=e.i(721930),n=e.i(471629),r=e.i(481139),i=e.i(61575);function c({tranches:e,emptyHint:a,registered:t}){return 0===e.length?a?(0,s.jsx)("p",{className:"font-sans text-sm text-muted-foreground/70",children:a}):null:(0,s.jsx)("div",{className:"grid gap-3 sm:grid-cols-2",children:e.map(e=>(0,s.jsx)(r.TrancheCard,{tranche:e,href:(0,i.trancheHref)(e,t),showProjects:!0},e.fileSlug))})}e.s(["TranchesTabs",0,function({active:e,archived:r,forge:i,registeredProjects:l}){let d=new Set(l);return(0,s.jsxs)("div",{className:"space-y-4",children:[(0,s.jsx)(n.ForgeBanners,{forge:i}),(0,s.jsxs)(a.Tabs,{defaultValue:"active",children:[(0,s.jsxs)(a.TabsList,{children:[(0,s.jsxs)(t.TabsTrigger,{value:"active",children:["Active (",e.length,")"]}),(0,s.jsxs)(t.TabsTrigger,{value:"archived",children:["Archived (",r.length,")"]})]}),(0,s.jsx)(a.TabsContent,{value:"active",children:(0,s.jsx)(c,{tranches:e,emptyHint:"ok"===i.active.kind?"No active tranches.":null,registered:d})}),(0,s.jsx)(a.TabsContent,{value:"archived",children:(0,s.jsx)(c,{tranches:r,emptyHint:"No archived tranches yet.",registered:d})})]})]})}])}]);
@@ -1 +0,0 @@
1
- (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,61575,e=>{"use strict";e.s(["NO_BOARD_REASON",0,"No board — no registered project for this tranche.","trancheHref",0,function(e,t){var s,a;let r;return s=e.projects,a=e.fileSlug,(r=s.find(e=>e&&t.has(e)))?`/studio/projects/${r}/tranches/${a}`:null}])},471629,481139,e=>{"use strict";var t=e.i(843476),s=e.i(853138);function a({scope:e,status:r,detail:n}){if("ok"===r.kind)return null;if("unreachable"===r.kind)return(0,t.jsxs)("div",{className:"flex items-start gap-2 rounded-md border border-warning/40 bg-warning/10 px-3 py-2 text-warning",children:[(0,t.jsx)(s.AlertTriangle,{className:"size-4 shrink-0 translate-y-0.5 text-warning","aria-hidden":!0}),(0,t.jsxs)("p",{className:"font-sans text-xs text-warning",children:["Live forge state unavailable — GitHub could not be reached."," ",n??"Showing archived/legacy data only; active tranches cannot be listed right now."]})]});let i="both"===e?"tranches":`${e} tranches`,c=r.failed.map(e=>e.slug).join(", ");return(0,t.jsxs)("div",{className:"flex items-start gap-2 rounded-md border border-warning/40 bg-warning/10 px-3 py-2 text-warning",children:[(0,t.jsx)(s.AlertTriangle,{className:"size-4 shrink-0 translate-y-0.5 text-warning","aria-hidden":!0}),(0,t.jsxs)("p",{className:"font-sans text-xs text-warning",children:["Live forge state partially unavailable — ",r.failed.length," of ",r.total," ",i," could not be loaded (",c,"). Shown counts exclude them."]})]})}e.s(["ForgeBanners",0,function({forge:e}){return"unreachable"===e.active.kind&&"unreachable"===e.archived.kind?(0,t.jsx)(a,{scope:"both",status:e.active}):(0,t.jsxs)("div",{className:"space-y-2",children:["ok"!==e.active.kind&&(0,t.jsx)(a,{scope:"active",status:e.active}),"ok"!==e.archived.kind&&(0,t.jsx)(a,{scope:"archived",status:e.archived})]})}],471629),e.i(207530);var r=e.i(336583),n=e.i(167012);let i=(0,e.i(456420).default)("arrow-right",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]);var c=e.i(271645),l=e.i(61575);function d({counts:e,archived:s}){let{total:a,done:r,ongoing:n,todo:i,blocked:l,dropped:o,incoherent:h,backlog:u,forgeAvailable:x}=e;if(!x)return(0,t.jsxs)("p",{children:[a," task",1===a?"":"s"]});if("active"!=(s?"archived":e.forgeAvailable&&e.done>0&&e.done+e.dropped===e.total?"awaiting-archive":"active"))return(0,t.jsx)("span",{className:"inline-block rounded border border-success/50 px-1.5 py-0.5 font-mono text-xs font-medium uppercase tracking-wider text-success",children:"done"});let m=a-o,g=m>0?Math.round(r/m*100):0,p=[{key:"done",label:`${r} done`,count:r,className:"text-success"},{key:"ongoing",label:`${n} active`,count:n,className:"text-primary"},{key:"todo",label:`${i} to do`,count:i},{key:"blocked",label:`${l} blocked`,count:l,className:"text-warning"},{key:"dropped",label:`${o} dropped`,count:o,className:"text-muted-foreground/70"},{key:"incoherent",label:`${h} incoherent`,count:h,className:"text-destructive"},{key:"backlog",label:`${u} backlog`,count:u,className:"text-muted-foreground/70"}].filter(e=>e.count>0);return(0,t.jsxs)("div",{className:"space-y-1",children:[(0,t.jsx)("div",{className:"h-1 overflow-hidden rounded-full bg-muted",children:(0,t.jsx)("div",{className:"h-full rounded-full bg-success",style:{width:`${g}%`}})}),(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsx)("span",{children:p.map((e,s)=>(0,t.jsxs)(c.Fragment,{children:[s>0&&" · ",(0,t.jsx)("span",{className:e.className,children:e.label})]},e.key))}),(0,t.jsxs)("span",{children:[g,"%"]})]})]})}e.s(["TrancheCard",0,function({tranche:e,href:s,showProjects:a=!1}){let c="group block",o=(0,t.jsxs)(r.Card,{children:[(0,t.jsx)(r.CardHeader,{className:"pb-2",children:(0,t.jsxs)(r.CardTitle,{className:"flex items-center justify-between font-serif text-xl text-card-foreground",children:[(0,t.jsx)("span",{children:e.name}),s?(0,t.jsx)(i,{className:"size-4 shrink-0 text-muted-foreground transition-transform group-hover:translate-x-0.5 group-hover:text-primary"}):null]})}),(0,t.jsxs)(r.CardContent,{className:"space-y-2 font-mono text-xs text-muted-foreground",children:[a&&e.projects.length>0&&(0,t.jsxs)("p",{children:["projects · ",e.projects.join(" · ")]}),!s&&(0,t.jsx)("p",{className:"font-sans text-xs text-muted-foreground/70",children:l.NO_BOARD_REASON}),e.goal&&(0,t.jsx)("p",{className:"line-clamp-2 font-sans text-xs",children:e.goal}),(0,t.jsx)(d,{counts:e.taskCounts,archived:e.archived})]})]});return s?(0,t.jsx)(n.NextLink,{variant:"unstyled",href:s,className:c,children:o}):(0,t.jsx)("div",{className:`${c} cursor-help`,title:l.NO_BOARD_REASON,children:o})}],481139)},865744,e=>{"use strict";var t=e.i(843476);e.i(207530);var s=e.i(336583),a=e.i(829834),r=e.i(721930);e.i(828627);var n=e.i(15758);let i=(0,e.i(456420).default)("inbox",[["polyline",{points:"22 12 16 12 14 15 10 15 8 12 2 12",key:"o97t9d"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}]]);var c=e.i(471629),l=e.i(481139);function d({projectName:e,tranches:a,emptyHint:r}){return 0===a.length?r?(0,t.jsx)(s.Card,{children:(0,t.jsxs)(s.CardContent,{className:"flex flex-col items-center gap-4 text-center",children:[(0,t.jsx)(i,{"aria-hidden":"true",className:"h-8 w-8 text-muted-foreground"}),(0,t.jsx)(n.Text,{className:"font-sans text-base text-muted-foreground",children:r})]})}):null:(0,t.jsx)("div",{className:"grid gap-3 sm:grid-cols-2",children:a.map(s=>(0,t.jsx)(l.TrancheCard,{tranche:s,href:`/studio/projects/${e}/tranches/${s.fileSlug}`,showProjects:!1},s.fileSlug))})}e.s(["ProjectTranchesTabs",0,function({projectName:e,active:s,archived:n,forge:i}){return(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsx)(c.ForgeBanners,{forge:i}),(0,t.jsxs)(a.Tabs,{defaultValue:"active",children:[(0,t.jsxs)(a.TabsList,{children:[(0,t.jsxs)(r.TabsTrigger,{value:"active",children:["Active (",s.length,")"]}),(0,t.jsxs)(r.TabsTrigger,{value:"archived",children:["Archived (",n.length,")"]})]}),(0,t.jsx)(a.TabsContent,{value:"active",children:(0,t.jsx)(d,{projectName:e,tranches:s,emptyHint:"ok"===i.active.kind?"No active tranches for this project.":null})}),(0,t.jsx)(a.TabsContent,{value:"archived",children:(0,t.jsx)(d,{projectName:e,tranches:n,emptyHint:"ok"===i.archived.kind?"No archived tranches yet.":null})})]})]})}],865744)}]);