@zaip-ai/cli 2.2.0 → 3.0.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 (571) hide show
  1. package/README.md +36 -13
  2. package/dist/services/adapters.d.ts +1 -1
  3. package/dist/services/adapters.d.ts.map +1 -1
  4. package/dist/services/adapters.js +26 -9
  5. package/dist/services/adapters.js.map +1 -1
  6. package/dist/services/agent-adapters.js +37 -18
  7. package/dist/services/agent-adapters.js.map +1 -1
  8. package/dist/services/agent-discovery.d.ts +27 -0
  9. package/dist/services/agent-discovery.d.ts.map +1 -0
  10. package/dist/services/agent-discovery.js +73 -0
  11. package/dist/services/agent-discovery.js.map +1 -0
  12. package/dist/services/codex-conversation-lifecycle-hook.d.ts.map +1 -1
  13. package/dist/services/codex-conversation-lifecycle-hook.js +164 -24
  14. package/dist/services/codex-conversation-lifecycle-hook.js.map +1 -1
  15. package/dist/services/codex-pre-tool-hook-template.d.ts.map +1 -1
  16. package/dist/services/codex-pre-tool-hook-template.js +146 -72
  17. package/dist/services/codex-pre-tool-hook-template.js.map +1 -1
  18. package/dist/services/codex-rules.d.ts +1 -1
  19. package/dist/services/codex-rules.d.ts.map +1 -1
  20. package/dist/services/codex-rules.js +3 -3
  21. package/dist/services/codex-subagent-hook-template.d.ts +1 -1
  22. package/dist/services/codex-subagent-hook-template.d.ts.map +1 -1
  23. package/dist/services/codex-subagent-hook-template.js +117 -66
  24. package/dist/services/codex-subagent-hook-template.js.map +1 -1
  25. package/dist/services/install-agents-template.d.ts.map +1 -1
  26. package/dist/services/install-agents-template.js +65 -7
  27. package/dist/services/install-agents-template.js.map +1 -1
  28. package/dist/services/logger.js +1 -1
  29. package/dist/services/logger.js.map +1 -1
  30. package/dist/services/logger.test.js +22 -1
  31. package/dist/services/logger.test.js.map +1 -1
  32. package/dist/services/runtime-template.test.js +153 -1
  33. package/dist/services/runtime-template.test.js.map +1 -1
  34. package/dist/services/transactional-files.d.ts.map +1 -1
  35. package/dist/services/transactional-files.js +59 -14
  36. package/dist/services/transactional-files.js.map +1 -1
  37. package/package.json +1 -1
  38. package/templates/.agents/.env.example +9 -3
  39. package/templates/.agents/README-ENG.md +101 -15
  40. package/templates/.agents/README.md +102 -17
  41. package/templates/.agents/architecture/software-architecture.md +1 -59
  42. package/templates/.agents/branding/brandbook.md +3 -0
  43. package/templates/.agents/config/agents/catalog.yaml +25 -10
  44. package/templates/.agents/config/agents/discovery.json +319 -0
  45. package/templates/.agents/config/clients/codex/agents/zaip-agent-analyst.toml +1 -1
  46. package/templates/.agents/config/clients/codex/agents/zaip-agent-auditor.toml +1 -1
  47. package/templates/.agents/config/clients/codex/agents/zaip-agent-backend.toml +3 -3
  48. package/templates/.agents/config/clients/codex/agents/zaip-agent-brand-strategist.toml +1 -1
  49. package/templates/.agents/config/clients/codex/agents/zaip-agent-builder.toml +3 -3
  50. package/templates/.agents/config/clients/codex/agents/zaip-agent-cloud-engineer.toml +12 -9
  51. package/templates/.agents/config/clients/codex/agents/zaip-agent-data-analyst.toml +1 -1
  52. package/templates/.agents/config/clients/codex/agents/zaip-agent-designer.toml +3 -3
  53. package/templates/.agents/config/clients/codex/agents/zaip-agent-finalizer.toml +2 -2
  54. package/templates/.agents/config/clients/codex/agents/zaip-agent-frontend.toml +3 -3
  55. package/templates/.agents/config/clients/codex/agents/zaip-agent-general-operations.toml +1 -1
  56. package/templates/.agents/config/clients/codex/agents/zaip-agent-governance-compliance.toml +1 -1
  57. package/templates/.agents/config/clients/codex/agents/zaip-agent-growth-strategist.toml +1 -1
  58. package/templates/.agents/config/clients/codex/agents/zaip-agent-integrator.toml +1 -1
  59. package/templates/.agents/config/clients/codex/agents/zaip-agent-marketing-analyst.toml +1 -1
  60. package/templates/.agents/config/clients/codex/agents/zaip-agent-orchestrator.toml +13 -10
  61. package/templates/.agents/config/clients/codex/agents/zaip-agent-refactoring-specialist.toml +1 -1
  62. package/templates/.agents/config/clients/codex/agents/zaip-agent-reviewer.toml +1 -1
  63. package/templates/.agents/config/clients/codex/agents/zaip-agent-sales-specialist.toml +1 -1
  64. package/templates/.agents/config/clients/codex/agents/zaip-agent-security-auditor.toml +1 -1
  65. package/templates/.agents/config/clients/codex/agents/zaip-agent-task-executor.toml +3 -3
  66. package/templates/.agents/config/clients/codex/agents/zaip-agent-website-developer.toml +3 -3
  67. package/templates/.agents/config/clients/codex/agents/zaip-agent-writer.toml +1 -1
  68. package/templates/.agents/config/pricing/models.json +9 -5
  69. package/templates/.agents/config/project.yaml +22 -2
  70. package/templates/.agents/dashboard/.zaip-managed.json +530 -138
  71. package/templates/.agents/dashboard/README.md +16 -0
  72. package/templates/.agents/dashboard/apps/frontend/dist/assets/CostCalculationGuidePage-CEDZjl4V.js +1 -0
  73. package/templates/.agents/dashboard/apps/frontend/dist/assets/{DashboardHelpDialog-DaSllaJp.js → DashboardHelpDialog-TnrL1ZyZ.js} +967 -578
  74. package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-DjQpBqGU.js +1 -0
  75. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-B9GWkEyN.css +1 -0
  76. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-BAvLPAee.js +3 -0
  77. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-BQZXUnQu.js +1 -0
  78. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-06__WZco.js +68 -0
  79. package/templates/.agents/dashboard/apps/frontend/dist/assets/dashboard-localization-Basaw1NR.js +824 -0
  80. package/templates/.agents/dashboard/apps/frontend/dist/assets/{icons-vendor-TPUT2IUt.js → icons-vendor-DEmo6Tn2.js} +1 -1
  81. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-BQe3zTvL.js +2 -0
  82. package/templates/.agents/dashboard/apps/frontend/dist/assets/{react-vendor-Ct48XHGL.js → react-vendor-CadYsm83.js} +1 -1
  83. package/templates/.agents/dashboard/apps/frontend/dist/assets/rolldown-runtime-Bh1tDfsg.js +1 -0
  84. package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-BzKK8kK3.js +1 -0
  85. package/templates/.agents/dashboard/apps/frontend/dist/index.html +6 -6
  86. package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
  87. package/templates/.agents/dashboard/apps/frontend/src/App.tsx +3 -1264
  88. package/templates/.agents/dashboard/apps/frontend/src/AppDashboardContent.tsx +368 -0
  89. package/templates/.agents/dashboard/apps/frontend/src/AutonomySettings.tsx +82 -0
  90. package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.dom.test.ts +130 -0
  91. package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.tsx +206 -157
  92. package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +3 -1
  93. package/templates/.agents/dashboard/apps/frontend/src/__tests__/app-composition-support.ts +12 -0
  94. package/templates/.agents/dashboard/apps/frontend/src/cost-monitor-population.test.tsx +149 -0
  95. package/templates/.agents/dashboard/apps/frontend/src/cost-period-refresh.test.ts +9 -7
  96. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api-settings.ts +152 -0
  97. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.test.ts +19 -0
  98. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +50 -154
  99. package/templates/.agents/dashboard/apps/frontend/src/dashboard-app-shell.tsx +33 -0
  100. package/templates/.agents/dashboard/apps/frontend/src/dashboard-cost-facts.test.ts +54 -0
  101. package/templates/.agents/dashboard/apps/frontend/src/dashboard-cost-facts.ts +48 -0
  102. package/templates/.agents/dashboard/apps/frontend/src/dashboard-localization.test.ts +37 -43
  103. package/templates/.agents/dashboard/apps/frontend/src/dashboard-localization.ts +9 -251
  104. package/templates/.agents/dashboard/apps/frontend/src/dashboard-project-overview.ts +35 -2
  105. package/templates/.agents/dashboard/apps/frontend/src/dashboard-retry.ts +17 -0
  106. package/templates/.agents/dashboard/apps/frontend/src/dashboard-setup-route.ts +29 -0
  107. package/templates/.agents/dashboard/apps/frontend/src/dashboard-view-actions.test.ts +51 -0
  108. package/templates/.agents/dashboard/apps/frontend/src/dashboard-view-actions.ts +68 -0
  109. package/templates/.agents/dashboard/apps/frontend/src/operations-period-render.test.ts +38 -2
  110. package/templates/.agents/dashboard/apps/frontend/src/operations-period.test.ts +19 -4
  111. package/templates/.agents/dashboard/apps/frontend/src/operations-period.ts +5 -3
  112. package/templates/.agents/dashboard/apps/frontend/src/overview-status-page.test.ts +2 -2
  113. package/templates/.agents/dashboard/apps/frontend/src/project-installation-status.test.ts +137 -0
  114. package/templates/.agents/dashboard/apps/frontend/src/project-installation-status.ts +66 -0
  115. package/templates/.agents/dashboard/apps/frontend/src/project-settings-copy.ts +181 -0
  116. package/templates/.agents/dashboard/apps/frontend/src/project-settings-model.ts +11 -1
  117. package/templates/.agents/dashboard/apps/frontend/src/project-settings-page.css +102 -51
  118. package/templates/.agents/dashboard/apps/frontend/src/project-settings-state.css +55 -0
  119. package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +14 -2
  120. package/templates/.agents/dashboard/apps/frontend/src/sao-paulo-day-rollover.test.ts +36 -0
  121. package/templates/.agents/dashboard/apps/frontend/src/sao-paulo-day-rollover.ts +30 -0
  122. package/templates/.agents/dashboard/apps/frontend/src/snapshot-banner-semantics.test.ts +2 -5
  123. package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +31 -20
  124. package/templates/.agents/dashboard/apps/frontend/src/traceability-task-pagination.ts +1 -2
  125. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.test.ts +6 -0
  126. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.ts +2 -0
  127. package/templates/.agents/dashboard/apps/frontend/src/use-app-effects.ts +9 -1
  128. package/templates/.agents/dashboard/apps/frontend/src/use-app-trace-documents.ts +3 -1
  129. package/templates/.agents/dashboard/apps/frontend/src/use-app-trace-task-pagination.ts +66 -0
  130. package/templates/.agents/dashboard/apps/frontend/src/use-app-work-board.ts +397 -0
  131. package/templates/.agents/dashboard/apps/frontend/src/use-dashboard-app-model.tsx +782 -0
  132. package/templates/.agents/dashboard/apps/frontend/src/use-snapshot-notice.tsx +49 -0
  133. package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
  134. package/templates/.agents/dashboard/modules/cost-monitor/src/complete-cost-average.test.ts +73 -0
  135. package/templates/.agents/dashboard/modules/cost-monitor/src/contracts.ts +9 -0
  136. package/templates/.agents/dashboard/modules/cost-monitor/src/period-averages.ts +60 -0
  137. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostDeveloperPanelSlot.tsx +16 -0
  138. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostGroupsTable.tsx +459 -0
  139. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorContent.tsx +8 -22
  140. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.test.ts +27 -17
  141. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +64 -189
  142. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorRunDialog.tsx +20 -0
  143. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostPeriodAverageCards.tsx +32 -8
  144. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables-hides-calls-that-have-no-collected.test.ts +80 -0
  145. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables-keeps-legacy-codex-identity-fields-blank.test.ts +455 -0
  146. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.test.ts +18 -525
  147. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.tsx +32 -508
  148. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-export-sources.ts +74 -0
  149. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-page-actions.ts +19 -0
  150. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-page-selectors.ts +49 -0
  151. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-summary.ts +3 -2
  152. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-table-formatters.ts +115 -0
  153. package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.ts +1 -42
  154. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.ts +2 -1
  155. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.test-fixtures.ts +2 -0
  156. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.ts +3 -2
  157. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.ts +8 -2
  158. package/templates/.agents/dashboard/modules/cost-monitor/src/server/index.ts +1 -0
  159. package/templates/.agents/dashboard/modules/operations/package.json +1 -1
  160. package/templates/.agents/dashboard/modules/operations/src/contracts.ts +4 -0
  161. package/templates/.agents/dashboard/modules/operations/src/react/EntityTableBadges.tsx +34 -0
  162. package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.tsx +8 -38
  163. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview-keeps-structure-classes-mutually-exclusive.test.ts +244 -0
  164. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.helpers.tsx +66 -3
  165. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.test.ts +98 -276
  166. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.tsx +105 -276
  167. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverviewCharts.tsx +171 -0
  168. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverviewPanels.tsx +64 -0
  169. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +9 -17
  170. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageOverview.tsx +3 -0
  171. package/templates/.agents/dashboard/modules/operations/src/react/OverviewCostKpi.tsx +46 -0
  172. package/templates/.agents/dashboard/modules/operations/src/react/PrdDocumentDialog.test.tsx +2 -1
  173. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.test.ts +28 -1
  174. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.tsx +11 -4
  175. package/templates/.agents/dashboard/modules/operations/src/react/index.ts +1 -0
  176. package/templates/.agents/dashboard/modules/operations/src/react/manual-work-priority.test.ts +2 -1
  177. package/templates/.agents/dashboard/modules/operations/src/react/operations-coverage-toast.test.ts +8 -4
  178. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview-period-filter.test.ts +34 -22
  179. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview.status-cards.test.ts +3 -1
  180. package/templates/.agents/dashboard/modules/operations/src/react/operations-page-contract.ts +21 -2
  181. package/templates/.agents/dashboard/modules/operations/src/react/overview-cost-card.test.tsx +89 -0
  182. package/templates/.agents/dashboard/modules/operations/src/react/overview-metric-format.ts +32 -0
  183. package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.test.ts +3 -3
  184. package/templates/.agents/dashboard/modules/operations/src/work-board-model.ts +2 -1
  185. package/templates/.agents/dashboard/modules/traceability/package.json +1 -1
  186. package/templates/.agents/dashboard/packages/branding/package.json +1 -1
  187. package/templates/.agents/dashboard/packages/branding/src/index.ts +1 -1
  188. package/templates/.agents/dashboard/packages/contracts/package.json +1 -1
  189. package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
  190. package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +1625 -1613
  191. package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +1592 -1582
  192. package/templates/.agents/dashboard/packages/local-runtime/package.json +3 -2
  193. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs +22 -28
  194. package/templates/.agents/dashboard/packages/local-runtime/server.mjs +1625 -1614
  195. package/templates/.agents/dashboard/packages/local-runtime/src/active-codex-telemetry.ts +25 -0
  196. package/templates/.agents/dashboard/packages/local-runtime/src/agent-catalog-settings.test.ts +1 -1
  197. package/templates/.agents/dashboard/packages/local-runtime/src/project-installation-summary.test.ts +142 -0
  198. package/templates/.agents/dashboard/packages/local-runtime/src/project-installation-summary.ts +190 -0
  199. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +118 -8
  200. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +92 -36
  201. package/templates/.agents/dashboard/packages/local-runtime/src/projection-refresh-diagnostics.ts +35 -0
  202. package/templates/.agents/dashboard/packages/local-runtime/src/server-browser-lease.test.ts +91 -0
  203. package/templates/.agents/dashboard/packages/local-runtime/src/server-browser-lease.ts +24 -4
  204. package/templates/.agents/dashboard/packages/local-runtime/src/server-costs-routes.ts +168 -0
  205. package/templates/.agents/dashboard/packages/local-runtime/src/server-dual-reads-manifest-summaries-without-losing.test.ts +344 -0
  206. package/templates/.agents/dashboard/packages/local-runtime/src/server-hono-security.test.ts +17 -0
  207. package/templates/.agents/dashboard/packages/local-runtime/src/server-http-contracts.ts +31 -0
  208. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-routes.ts +364 -0
  209. package/templates/.agents/dashboard/packages/local-runtime/src/server-read-projections.ts +461 -0
  210. package/templates/.agents/dashboard/packages/local-runtime/src/server-reconciliation-refresh.test.ts +78 -0
  211. package/templates/.agents/dashboard/packages/local-runtime/src/server-route-context.ts +13 -0
  212. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-refresh.test.ts +94 -2
  213. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-refresh.ts +62 -12
  214. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-synchronization.test.ts +44 -0
  215. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-synchronization.ts +22 -3
  216. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot.test.ts +22 -21
  217. package/templates/.agents/dashboard/packages/local-runtime/src/server-sqlite-task-trace.test.ts +97 -0
  218. package/templates/.agents/dashboard/packages/local-runtime/src/server-sqlite-task-trace.ts +10 -13
  219. package/templates/.agents/dashboard/packages/local-runtime/src/server-sqlite-view-allowlist.test.ts +25 -0
  220. package/templates/.agents/dashboard/packages/local-runtime/src/server-trace-routes.ts +56 -0
  221. package/templates/.agents/dashboard/packages/local-runtime/src/server-traceability-index.test.ts +84 -0
  222. package/templates/.agents/dashboard/packages/local-runtime/src/server-work-reconciliation.test.ts +2 -30
  223. package/templates/.agents/dashboard/packages/local-runtime/src/server-work-reconciliation.ts +6 -23
  224. package/templates/.agents/dashboard/packages/local-runtime/src/server.test-fixtures.ts +1 -1
  225. package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +2 -330
  226. package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +87 -1060
  227. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-dimension-facts.test.ts +12 -1
  228. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-file-index.test.ts +69 -0
  229. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-first-fold-cache.ts +3 -1
  230. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-force-canonical.test.ts +3 -1
  231. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-incremental-refresh.test.ts +2 -0
  232. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-materialize-first-fold.ts +78 -0
  233. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-materialize-projections.ts +570 -0
  234. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-materialize-runs.ts +600 -0
  235. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.test.ts +1 -1
  236. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-period-averages.ts +46 -0
  237. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-provider-alias-parity.test.ts +50 -0
  238. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-agent-dimension.ts +269 -0
  239. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-context.ts +32 -0
  240. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-entity-group.ts +244 -0
  241. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-filtered-dimension.ts +303 -0
  242. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-financial.ts +547 -0
  243. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-model-dimension.ts +360 -0
  244. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-provider-dimension.ts +169 -0
  245. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-summary.ts +493 -0
  246. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-temporal-dimension.ts +134 -0
  247. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-timing.ts +299 -0
  248. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-view-page.ts +692 -0
  249. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-counts-every-root-execution-day-returns.test.ts +763 -0
  250. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-does-not-convert-delayed-historical-finalizer.test.ts +706 -0
  251. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-filesystem.ts +762 -0
  252. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-first-fold-types.ts +1 -1
  253. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-keeps-orphan-telemetry-out-kanban-without.test.ts +710 -0
  254. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-marks-token-cost-telemetry-unavailable-when.test.ts +618 -0
  255. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-rebuild.ts +764 -0
  256. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-rebuilds-disposable-snapshot-serves-zaip-records.test.ts +276 -0
  257. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-schema.ts +193 -0
  258. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-source-fingerprint.test.ts +54 -1
  259. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-source-fingerprint.ts +7 -3
  260. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-types.ts +123 -0
  261. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +5 -2806
  262. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.ts +17 -6930
  263. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-risk-population.test.ts +98 -0
  264. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-schema-base-views.ts +390 -0
  265. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-schema-dashboard-views.ts +413 -0
  266. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-snapshot-seed.test.ts +2 -0
  267. package/templates/.agents/dashboard/packages/local-runtime/src/verify-project-settings.mjs +57 -0
  268. package/templates/.agents/dashboard/packages/local-runtime/src/work-priority-contract.test.ts +4 -3
  269. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-build.mjs +195 -0
  270. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-lifecycle.test.mjs +2 -7
  271. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-logging.mjs +35 -0
  272. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-navigation.mjs +114 -0
  273. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-paths.mjs +90 -0
  274. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.mjs +89 -418
  275. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +22 -12
  276. package/templates/.agents/dashboard/packages/ui/package.json +1 -1
  277. package/templates/.agents/dashboard/scripts/qualify-observability.mjs +130 -0
  278. package/templates/.agents/dashboard/scripts/verify-autonomy-settings.mjs +175 -0
  279. package/templates/.agents/dashboard/scripts/verify-observability.mjs +254 -0
  280. package/templates/.agents/dashboard/scripts/verify-project-setup.mjs +64 -0
  281. package/templates/.agents/dashboard/tests/e2e/lease-global-setup.ts +37 -0
  282. package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
  283. package/templates/.agents/dashboard/tests/e2e/playwright.config.ts +9 -4
  284. package/templates/.agents/dashboard/tests/e2e/specs/cost-monitor-period-transition.spec.ts +22 -1
  285. package/templates/.agents/dashboard/tests/e2e/specs/dashboard-performance-matrix.spec.ts +17 -8
  286. package/templates/.agents/dashboard/tests/e2e/specs/dashboard.spec.ts +47 -6
  287. package/templates/.agents/dashboard/tests/e2e/specs/lease-lifetime.spec.ts +14 -0
  288. package/templates/.agents/dashboard/tests/observability-fixture.mjs +200 -0
  289. package/templates/.agents/design/.zaip-managed.json +86 -42
  290. package/templates/.agents/design/DESIGN.md +2 -186
  291. package/templates/.agents/design/README.md +12 -2
  292. package/templates/.agents/design/apps/catalog/dist/assets/index-BJV597iq.js +72 -0
  293. package/templates/.agents/design/apps/catalog/dist/assets/index-BOjCcUaU.js +72 -0
  294. package/templates/.agents/design/apps/catalog/dist/assets/index-B_WhrCZe.js +72 -0
  295. package/templates/.agents/design/apps/catalog/dist/assets/index-CqtYXZfV.js +72 -0
  296. package/templates/.agents/design/apps/catalog/dist/assets/index-D_lfqoyx.js +72 -0
  297. package/templates/.agents/design/apps/catalog/dist/assets/index-i_PO2k9R.js +9 -0
  298. package/templates/.agents/design/apps/catalog/dist/index.html +1 -1
  299. package/templates/.agents/design/apps/catalog/dist/storybook/assets/CatalogShell-Cstn1UwA.js +1 -0
  300. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{Color-6AOWCN3U-B-kAgAjB.js → Color-6AOWCN3U-Cm-yJJz_.js} +1 -1
  301. package/templates/.agents/design/apps/catalog/dist/storybook/assets/Components.stories-D1WopB2L.js +137 -0
  302. package/templates/.agents/design/apps/catalog/dist/storybook/assets/DesignSystem.stories-DQ9PJ3N3.js +1 -0
  303. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{DocsRenderer-JROSPFPF-BVN7xHtv.js → DocsRenderer-JROSPFPF-Belk4jRr.js} +4 -4
  304. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{WithTooltip-7X4HQR7L-CDHtKYkz.js → WithTooltip-7X4HQR7L-DoPvjkS1.js} +1 -1
  305. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{chunk-DRQKCCAG-D6AsDkMK.js → chunk-DRQKCCAG-B1itKXEN.js} +1 -1
  306. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{chunk-W22LQPXL-B4m5uloN.js → chunk-W22LQPXL-C-Eb5SPY.js} +1 -1
  307. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{components-CN8YyTUg.js → components-DnyKLwhj.js} +5 -5
  308. package/templates/.agents/design/apps/catalog/dist/storybook/assets/formatter-L2YTDE3Q-D0OSgxWz.js +1 -0
  309. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{iframe-9yZfIsdT.js → iframe-DcXBsFPz.js} +3 -3
  310. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{react-18-BoCSnq6H.js → react-18-CRM89QRf.js} +1 -1
  311. package/templates/.agents/design/apps/catalog/dist/storybook/assets/react-C3tkVMIp.js +1 -0
  312. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{syntaxhighlighter-YFXUGROL-Bnn_nMwJ.js → syntaxhighlighter-YFXUGROL-B03jQGTF.js} +1 -1
  313. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{theming-DS_ue2sb.js → theming-4ZyufAga.js} +1 -1
  314. package/templates/.agents/design/apps/catalog/dist/storybook/iframe.html +1 -1
  315. package/templates/.agents/design/apps/catalog/dist/storybook/index.json +1 -1
  316. package/templates/.agents/design/apps/catalog/package.json +2 -2
  317. package/templates/.agents/design/apps/catalog/src/components/AutonomySpecimen.tsx +15 -0
  318. package/templates/.agents/design/apps/catalog/src/components/CostPopulationSpecimen.test.tsx +19 -0
  319. package/templates/.agents/design/apps/catalog/src/components/CostPopulationSpecimen.tsx +45 -0
  320. package/templates/.agents/design/apps/catalog/src/components/EstimatedCostSpecimen.tsx +48 -0
  321. package/templates/.agents/design/apps/catalog/src/components/ProjectStatusSpecimen.tsx +169 -0
  322. package/templates/.agents/design/apps/catalog/src/pages/ComponentsPage.tsx +55 -0
  323. package/templates/.agents/design/apps/catalog/src/stories/Components.stories.tsx +60 -0
  324. package/templates/.agents/design/packages/local-runtime/package.json +1 -1
  325. package/templates/.agents/growth/strategy.md +3 -0
  326. package/templates/.agents/marketing/strategy.md +3 -0
  327. package/templates/.agents/requirements/autonomous-assurance.md +2 -1
  328. package/templates/.agents/requirements/cloud-hostinger-autonomy.md +1 -1
  329. package/templates/.agents/requirements/comparative-audit.md +1 -1
  330. package/templates/.agents/requirements/context-engine.md +1 -1
  331. package/templates/.agents/requirements/cost-observability.md +1 -1
  332. package/templates/.agents/requirements/dashboard-launch.md +1 -1
  333. package/templates/.agents/requirements/data-export.md +1 -1
  334. package/templates/.agents/requirements/design-system.md +13 -4
  335. package/templates/.agents/requirements/execution-engine.md +1 -1
  336. package/templates/.agents/requirements/kanban-dashboard.md +1 -1
  337. package/templates/.agents/requirements/model-orchestration.md +1 -1
  338. package/templates/.agents/requirements/public-distribution.md +4 -2
  339. package/templates/.agents/requirements/software-architecture.md +1 -1
  340. package/templates/.agents/requirements/strategic-improvements.md +1 -1
  341. package/templates/.agents/requirements/work-lifecycle.md +6 -6
  342. package/templates/.agents/requirements/zaip-strategic-95.md +1 -1
  343. package/templates/.agents/rules/architecture.md +2 -0
  344. package/templates/.agents/rules/astra-diagnostic.md +3 -1
  345. package/templates/.agents/rules/autonomy-decision.md +12 -2
  346. package/templates/.agents/rules/cloud-hostinger-autonomy.md +2 -0
  347. package/templates/.agents/rules/context.md +2 -1
  348. package/templates/.agents/rules/core.md +15 -4
  349. package/templates/.agents/rules/design-system-central-contract.md +17 -0
  350. package/templates/.agents/rules/evolution.md +3 -1
  351. package/templates/.agents/rules/frontend-lite.md +3 -1
  352. package/templates/.agents/rules/local-sqlite-storage.md +2 -2
  353. package/templates/.agents/rules/meta-mcp.md +3 -1
  354. package/templates/.agents/rules/model-orchestration.md +1 -1
  355. package/templates/.agents/rules/run-lifecycle-closure.md +11 -7
  356. package/templates/.agents/rules/security.md +3 -1
  357. package/templates/.agents/rules/specialist-routing.md +3 -1
  358. package/templates/.agents/rules/text-writing-utf8.md +1 -1
  359. package/templates/.agents/rules/workflow.md +7 -5
  360. package/templates/.agents/runtime/VERSION +1 -1
  361. package/templates/.agents/runtime/bin/zaip.mjs +821 -516
  362. package/templates/.agents/runtime/checksums.sha256 +6 -6
  363. package/templates/.agents/runtime/manifest.json +1 -1
  364. package/templates/.agents/runtime/pnpm-lock.sha256 +1 -1
  365. package/templates/.agents/runtime/provenance.json +5 -5
  366. package/templates/.agents/runtime/sbom.cdx.json +3 -3
  367. package/templates/.agents/sales/playbook.md +3 -0
  368. package/templates/.agents/skills/zaip-aios/SKILL.md +5 -3
  369. package/templates/.agents/skills/zaip-skill-adapt-stack/SKILL.md +1 -0
  370. package/templates/.agents/skills/zaip-skill-api-contracts/SKILL.md +14 -0
  371. package/templates/.agents/skills/zaip-skill-api-contracts/agents/openai.yaml +4 -0
  372. package/templates/.agents/skills/zaip-skill-application-observability/SKILL.md +15 -0
  373. package/templates/.agents/skills/zaip-skill-application-observability/agents/openai.yaml +4 -0
  374. package/templates/.agents/skills/zaip-skill-application-observability/references/signal-design.md +3 -0
  375. package/templates/.agents/skills/zaip-skill-application-readiness/SKILL.md +15 -0
  376. package/templates/.agents/skills/zaip-skill-application-readiness/agents/openai.yaml +4 -0
  377. package/templates/.agents/skills/zaip-skill-application-readiness/references/evidence-matrix.md +3 -0
  378. package/templates/.agents/skills/zaip-skill-architecture-design/SKILL.md +14 -0
  379. package/templates/.agents/skills/zaip-skill-architecture-design/agents/openai.yaml +4 -0
  380. package/templates/.agents/skills/zaip-skill-async-jobs/SKILL.md +14 -0
  381. package/templates/.agents/skills/zaip-skill-async-jobs/agents/openai.yaml +4 -0
  382. package/templates/.agents/skills/zaip-skill-auth-tenancy/SKILL.md +15 -0
  383. package/templates/.agents/skills/zaip-skill-auth-tenancy/agents/openai.yaml +4 -0
  384. package/templates/.agents/skills/zaip-skill-auth-tenancy/references/data-access-paths.md +9 -0
  385. package/templates/.agents/skills/zaip-skill-auth-tenancy/references/worker-scenario.md +5 -0
  386. package/templates/.agents/skills/zaip-skill-auth-tenancy/scripts/worker-contract.test.mjs +27 -0
  387. package/templates/.agents/skills/zaip-skill-author-skills/SKILL.md +2 -0
  388. package/templates/.agents/skills/zaip-skill-author-skills/references/engineering-skill-index.md +9 -0
  389. package/templates/.agents/skills/zaip-skill-author-skills/scripts/audit-skill-catalog.mjs +5 -3
  390. package/templates/.agents/skills/zaip-skill-author-skills/scripts/author-skill-scripts.test.mjs +27 -0
  391. package/templates/.agents/skills/zaip-skill-backend/SKILL.md +4 -0
  392. package/templates/.agents/skills/zaip-skill-backend/references/deployment-environments.md +75 -0
  393. package/templates/.agents/skills/zaip-skill-backend/references/supabase-migration-contract.md +23 -0
  394. package/templates/.agents/skills/zaip-skill-brand-governance/SKILL.md +2 -0
  395. package/templates/.agents/skills/zaip-skill-cache-strategy/SKILL.md +14 -0
  396. package/templates/.agents/skills/zaip-skill-cache-strategy/agents/openai.yaml +4 -0
  397. package/templates/.agents/skills/zaip-skill-change/SKILL.md +1 -1
  398. package/templates/.agents/skills/zaip-skill-cloud-engineering/SKILL.md +7 -0
  399. package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/SKILL.md +37 -0
  400. package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/agents/openai.yaml +6 -0
  401. package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/references/workers-static-assets.md +26 -0
  402. package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/references/workflow-templates.md +71 -0
  403. package/templates/.agents/skills/zaip-skill-cloudflare-github-deploy/scripts/cloudflare-github-deploy-contract.test.mjs +77 -0
  404. package/templates/.agents/skills/zaip-skill-config/SKILL.md +21 -11
  405. package/templates/.agents/skills/zaip-skill-config/agents/openai.yaml +2 -2
  406. package/templates/.agents/skills/zaip-skill-container-runtime/SKILL.md +14 -0
  407. package/templates/.agents/skills/zaip-skill-container-runtime/agents/openai.yaml +4 -0
  408. package/templates/.agents/skills/zaip-skill-context/SKILL.md +6 -1
  409. package/templates/.agents/skills/zaip-skill-context/references/prd-spec-task-handoff.md +10 -0
  410. package/templates/.agents/skills/zaip-skill-context/references/rule-selection.md +20 -0
  411. package/templates/.agents/skills/zaip-skill-cqrs/SKILL.md +1 -0
  412. package/templates/.agents/skills/zaip-skill-cybersecurity/SKILL.md +18 -0
  413. package/templates/.agents/skills/zaip-skill-cybersecurity/agents/openai.yaml +4 -0
  414. package/templates/.agents/skills/zaip-skill-cybersecurity/references/audit-contract.md +94 -0
  415. package/templates/.agents/skills/zaip-skill-cybersecurity/scripts/score-audit.mjs +185 -0
  416. package/templates/.agents/skills/zaip-skill-cybersecurity/scripts/score-audit.test.mjs +101 -0
  417. package/templates/.agents/skills/zaip-skill-data-modeling/SKILL.md +14 -0
  418. package/templates/.agents/skills/zaip-skill-data-modeling/agents/openai.yaml +4 -0
  419. package/templates/.agents/skills/zaip-skill-database-migrations/SKILL.md +20 -0
  420. package/templates/.agents/skills/zaip-skill-database-migrations/agents/openai.yaml +4 -0
  421. package/templates/.agents/skills/zaip-skill-database-migrations/references/manual-mode.md +15 -0
  422. package/templates/.agents/skills/zaip-skill-database-migrations/references/promotion-example.md +5 -0
  423. package/templates/.agents/skills/zaip-skill-database-migrations/scripts/export-manual-sql.mjs +145 -0
  424. package/templates/.agents/skills/zaip-skill-database-migrations/scripts/export-manual-sql.test.mjs +178 -0
  425. package/templates/.agents/skills/zaip-skill-dependency-upgrade/SKILL.md +14 -0
  426. package/templates/.agents/skills/zaip-skill-dependency-upgrade/agents/openai.yaml +4 -0
  427. package/templates/.agents/skills/zaip-skill-deployment-pipeline/SKILL.md +15 -0
  428. package/templates/.agents/skills/zaip-skill-deployment-pipeline/agents/openai.yaml +4 -0
  429. package/templates/.agents/skills/zaip-skill-deployment-pipeline/references/runtime-shapes.md +3 -0
  430. package/templates/.agents/skills/zaip-skill-design-system/SKILL.md +20 -9
  431. package/templates/.agents/skills/zaip-skill-dev-environment/SKILL.md +16 -0
  432. package/templates/.agents/skills/zaip-skill-dev-environment/agents/openai.yaml +4 -0
  433. package/templates/.agents/skills/zaip-skill-dev-environment/references/inventory-contract.md +7 -0
  434. package/templates/.agents/skills/zaip-skill-dev-environment/scripts/inventory.mjs +77 -0
  435. package/templates/.agents/skills/zaip-skill-disaster-recovery/SKILL.md +15 -0
  436. package/templates/.agents/skills/zaip-skill-disaster-recovery/agents/openai.yaml +4 -0
  437. package/templates/.agents/skills/zaip-skill-disaster-recovery/references/recovery-scope.md +3 -0
  438. package/templates/.agents/skills/zaip-skill-execution/SKILL.md +31 -8
  439. package/templates/.agents/skills/zaip-skill-execution/references/correction-cycle.md +7 -0
  440. package/templates/.agents/skills/zaip-skill-execution/references/runtime-governance.md +18 -8
  441. package/templates/.agents/skills/zaip-skill-external-integrations/SKILL.md +14 -0
  442. package/templates/.agents/skills/zaip-skill-external-integrations/agents/openai.yaml +4 -0
  443. package/templates/.agents/skills/zaip-skill-frontend/SKILL.md +4 -0
  444. package/templates/.agents/skills/zaip-skill-frontend-componentization/SKILL.md +44 -0
  445. package/templates/.agents/skills/zaip-skill-frontend-componentization/agents/openai.yaml +4 -0
  446. package/templates/.agents/skills/zaip-skill-frontend-data-flows/SKILL.md +14 -0
  447. package/templates/.agents/skills/zaip-skill-frontend-data-flows/agents/openai.yaml +4 -0
  448. package/templates/.agents/skills/zaip-skill-general-operations/SKILL.md +2 -0
  449. package/templates/.agents/skills/zaip-skill-github-actions-setup/SKILL.md +36 -0
  450. package/templates/.agents/skills/zaip-skill-github-actions-setup/agents/openai.yaml +4 -0
  451. package/templates/.agents/skills/zaip-skill-github-actions-setup/references/cloudflare-pages.md +33 -0
  452. package/templates/.agents/skills/zaip-skill-github-actions-setup/references/github.md +63 -0
  453. package/templates/.agents/skills/zaip-skill-github-actions-setup/references/hostinger-vps.md +55 -0
  454. package/templates/.agents/skills/zaip-skill-github-actions-setup/references/npm.md +30 -0
  455. package/templates/.agents/skills/zaip-skill-github-actions-setup/scripts/check-skill.mjs +55 -0
  456. package/templates/.agents/skills/zaip-skill-github-actions-setup/scripts/verify-cloudflare.mjs +61 -0
  457. package/templates/.agents/skills/zaip-skill-github-actions-setup/scripts/verify-cloudflare.test.mjs +128 -0
  458. package/templates/.agents/skills/zaip-skill-github-actions-setup/scripts/verify-ssh.integration.test.mjs +106 -0
  459. package/templates/.agents/skills/zaip-skill-github-deploy/SKILL.md +42 -76
  460. package/templates/.agents/skills/zaip-skill-github-deploy/references/deployment-workflow.md +135 -0
  461. package/templates/.agents/skills/zaip-skill-github-deploy/references/github-release-workflow-template.md +31 -0
  462. package/templates/.agents/skills/zaip-skill-github-deploy/references/release-gate-matrix.md +24 -0
  463. package/templates/.agents/skills/zaip-skill-github-deploy/references/release-identity.md +44 -0
  464. package/templates/.agents/skills/zaip-skill-github-deploy/references/release-notes.md +134 -0
  465. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/consumer-release-preparation.mjs +389 -0
  466. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/consumer-release-preparation.test.mjs +134 -0
  467. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-deploy-contract.test.mjs +25 -2
  468. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-readiness-api.test.mjs +134 -0
  469. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-readiness.mjs +98 -0
  470. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-readiness.test.mjs +25 -0
  471. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/install-github-readiness-workflow.mjs +159 -0
  472. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/install-github-readiness-workflow.test.mjs +160 -0
  473. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/preflight.mjs +149 -12
  474. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/preflight.test.mjs +64 -5
  475. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/release-notes-coverage.test.mjs +126 -0
  476. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/resolve-release-identity.mjs +78 -0
  477. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/resolve-release-identity.test.mjs +51 -0
  478. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/validate-release-notes.mjs +184 -0
  479. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/validate-release-notes.test.mjs +109 -0
  480. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/SKILL.md +2 -0
  481. package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/SKILL.md +18 -10
  482. package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/agents/openai.yaml +3 -4
  483. package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/references/aws-cli-terraform.md +62 -0
  484. package/templates/.agents/skills/zaip-skill-hostinger-cloudflare-terraform/references/guia-iniciante-hostinger-vps.md +183 -0
  485. package/templates/.agents/skills/zaip-skill-marketing/SKILL.md +2 -0
  486. package/templates/.agents/skills/zaip-skill-module-scaffold/SKILL.md +14 -0
  487. package/templates/.agents/skills/zaip-skill-module-scaffold/agents/openai.yaml +4 -0
  488. package/templates/.agents/skills/zaip-skill-module-scaffold/references/scaffold-contract.md +9 -0
  489. package/templates/.agents/skills/zaip-skill-module-scaffold/scripts/helpers.test.mjs +121 -0
  490. package/templates/.agents/skills/zaip-skill-module-scaffold/scripts/scaffold.mjs +169 -0
  491. package/templates/.agents/skills/zaip-skill-move-prd/SKILL.md +3 -1
  492. package/templates/.agents/skills/zaip-skill-move-spec/SKILL.md +1 -1
  493. package/templates/.agents/skills/zaip-skill-performance-engineering/SKILL.md +14 -0
  494. package/templates/.agents/skills/zaip-skill-performance-engineering/agents/openai.yaml +4 -0
  495. package/templates/.agents/skills/zaip-skill-prd/SKILL.md +3 -1
  496. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-local-telemetry.mjs +1 -0
  497. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.mjs +26 -9
  498. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.test.mjs +39 -13
  499. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.mjs +1 -0
  500. package/templates/.agents/skills/zaip-skill-refactor-landing-page/SKILL.md +66 -0
  501. package/templates/.agents/skills/zaip-skill-refactor-landing-page/agents/openai.yaml +4 -0
  502. package/templates/.agents/skills/zaip-skill-refactor-landing-page/references/behavioral-dry-run.md +23 -0
  503. package/templates/.agents/skills/zaip-skill-release-qualification/SKILL.md +38 -1
  504. package/templates/.agents/skills/zaip-skill-release-qualification/references/local-preparation.md +122 -0
  505. package/templates/.agents/skills/zaip-skill-review/SKILL.md +1 -0
  506. package/templates/.agents/skills/zaip-skill-rules/SKILL.md +3 -3
  507. package/templates/.agents/skills/zaip-skill-sales-methodology/SKILL.md +2 -0
  508. package/templates/.agents/skills/zaip-skill-setup/SKILL.md +21 -21
  509. package/templates/.agents/skills/zaip-skill-setup/agents/openai.yaml +2 -2
  510. package/templates/.agents/skills/zaip-skill-spec/SKILL.md +3 -2
  511. package/templates/.agents/skills/zaip-skill-storage-uploads/SKILL.md +14 -0
  512. package/templates/.agents/skills/zaip-skill-storage-uploads/agents/openai.yaml +4 -0
  513. package/templates/.agents/skills/zaip-skill-systematic-debugging/SKILL.md +14 -0
  514. package/templates/.agents/skills/zaip-skill-systematic-debugging/agents/openai.yaml +4 -0
  515. package/templates/.agents/skills/zaip-skill-task/SKILL.md +16 -7
  516. package/templates/.agents/skills/zaip-skill-task/references/commit-policy.md +25 -0
  517. package/templates/.agents/skills/zaip-skill-test-data/SKILL.md +14 -0
  518. package/templates/.agents/skills/zaip-skill-test-data/agents/openai.yaml +4 -0
  519. package/templates/.agents/skills/zaip-skill-test-data/scripts/generate.mjs +72 -0
  520. package/templates/.agents/skills/zaip-skill-testing-strategy/SKILL.md +15 -0
  521. package/templates/.agents/skills/zaip-skill-testing-strategy/agents/openai.yaml +4 -0
  522. package/templates/.agents/skills/zaip-skill-testing-strategy/references/example-map.md +3 -0
  523. package/templates/.agents/skills/zaip-skill-tool-setup/SKILL.md +2 -0
  524. package/templates/.agents/skills/zaip-skill-website-readiness/SKILL.md +8 -0
  525. package/templates/.agents/zaip-aios/INDEX.md +9 -1
  526. package/templates/.agents/zaip-aios/README.md +23 -2
  527. package/templates/.agents/zaip-aios/VERSION +1 -1
  528. package/templates/.agents/zaip-aios/guides/01-primeiros-passos.md +5 -1
  529. package/templates/.agents/zaip-aios/guides/03-tasks.md +15 -2
  530. package/templates/.agents/zaip-aios/guides/04-specs.md +13 -0
  531. package/templates/.agents/zaip-aios/guides/05-prds.md +13 -0
  532. package/templates/.agents/zaip-aios/guides/06-execucao.md +19 -4
  533. package/templates/.agents/zaip-aios/guides/07-revisao-e-validacao.md +14 -0
  534. package/templates/.agents/zaip-aios/guides/08-contexto-e-tokens.md +4 -3
  535. package/templates/.agents/zaip-aios/guides/09-agentes-e-squads.md +17 -9
  536. package/templates/.agents/zaip-aios/guides/10-seguranca.md +11 -1
  537. package/templates/.agents/zaip-aios/guides/11-observabilidade-e-custos.md +69 -0
  538. package/templates/.agents/zaip-aios/guides/12-instalacao-e-upgrade.md +9 -4
  539. package/templates/.agents/zaip-aios/guides/13-boas-praticas.md +7 -1
  540. package/templates/.agents/zaip-aios/guides/14-troubleshooting.md +18 -0
  541. package/templates/.agents/zaip-aios/guides/16-lifecycle-e-reconciliacao.md +54 -3
  542. package/templates/.agents/zaip-aios/guides/18-catalogo-de-agentes.md +10 -2
  543. package/templates/.agents/zaip-aios/guides/19-assurance-e-autonomia.md +186 -5
  544. package/templates/.agents/zaip-aios/guides/20-instalacao-detalhada.md +26 -18
  545. package/templates/.agents/zaip-aios/guides/21-telemetria-monitor-custos.md +18 -2
  546. package/templates/.agents/zaip-aios/guides/22-fluxos-e-roteamento.md +14 -2
  547. package/templates/.agents/zaip-aios/guides/23-orquestracao-de-modelos.md +190 -489
  548. package/templates/.agents/zaip-aios/guides/26-qualidade-e-release.md +61 -13
  549. package/templates/.agents/zaip-aios/guides/27-telemetria-git-native.md +18 -0
  550. package/templates/.agents/zaip-aios/guides/28-lifecycle-completo.md +18 -1
  551. package/templates/scripts/validate-cloud-hostinger-contract.mjs +34 -0
  552. package/templates/template-manifest.json +1229 -329
  553. package/templates/.agents/branding/.gitkeep +0 -0
  554. package/templates/.agents/dashboard/apps/frontend/dist/assets/CostCalculationGuidePage-snUCQYTC.js +0 -1
  555. package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-BPtVUGgs.js +0 -1
  556. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-3Awyaovx.js +0 -3
  557. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-GgzpZ_PY.css +0 -1
  558. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-BCvZFMEf.js +0 -1
  559. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-DbaLbU2q.js +0 -68
  560. package/templates/.agents/dashboard/apps/frontend/dist/assets/dashboard-localization-CLJ0lT9v.js +0 -231
  561. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-_MEktQNM.js +0 -2
  562. package/templates/.agents/dashboard/apps/frontend/dist/assets/rolldown-runtime-D9-fqq9M.js +0 -1
  563. package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-BDe4_Ubl.js +0 -1
  564. package/templates/.agents/design/apps/catalog/dist/storybook/assets/CatalogShell-BWY-80s4.js +0 -1
  565. package/templates/.agents/design/apps/catalog/dist/storybook/assets/Components.stories-Be2mDUQj.js +0 -27
  566. package/templates/.agents/design/apps/catalog/dist/storybook/assets/DesignSystem.stories-DRx9blDs.js +0 -1
  567. package/templates/.agents/design/apps/catalog/dist/storybook/assets/formatter-L2YTDE3Q-EwuTh8Zk.js +0 -1
  568. package/templates/.agents/design/apps/catalog/dist/storybook/assets/react-DyL61NPT.js +0 -1
  569. package/templates/.agents/growth/.gitkeep +0 -0
  570. package/templates/.agents/marketing/.gitkeep +0 -0
  571. package/templates/.agents/sales/.gitkeep +0 -0
@@ -1,11 +1,44 @@
1
1
  import { spawn } from "node:child_process";
2
2
  import { existsSync } from "node:fs";
3
3
  import { resolve } from "node:path";
4
+ import { type SqliteReadModelFileSystem, sqliteReadModelPath } from "./sqlite-read-model.js";
4
5
  import {
5
- type SqliteReadModelFileSystem,
6
- sqliteReadModelPath,
7
- validateSqliteReadModelSchema,
8
- } from "./sqlite-read-model.js";
6
+ readModelSchemaVersion,
7
+ requiredIndexes,
8
+ requiredPersistedTables,
9
+ requiredViews,
10
+ } from "./sqlite-read-model-schema.js";
11
+
12
+ /** The worker validates integrity and schema before emitting this receipt. */
13
+ export function validateSnapshotWorkerReceipt(stdout: string, destination: string): void {
14
+ const result = JSON.parse(stdout) as {
15
+ storage_mode?: unknown;
16
+ path?: unknown;
17
+ schema?: {
18
+ schemaVersion?: unknown;
19
+ tableCount?: unknown;
20
+ viewCount?: unknown;
21
+ indexCount?: unknown;
22
+ };
23
+ } | null;
24
+ const schema = result?.schema;
25
+ if (
26
+ result?.storage_mode !== "sqlite_read_model" ||
27
+ typeof result.path !== "string" ||
28
+ resolve(result.path) !== resolve(destination) ||
29
+ schema?.schemaVersion !== readModelSchemaVersion ||
30
+ schema.tableCount !== requiredPersistedTables.length ||
31
+ typeof schema.viewCount !== "number" ||
32
+ !Number.isSafeInteger(schema.viewCount) ||
33
+ schema.viewCount < requiredViews.length ||
34
+ typeof schema.indexCount !== "number" ||
35
+ !Number.isSafeInteger(schema.indexCount) ||
36
+ schema.indexCount < requiredIndexes.length
37
+ )
38
+ throw new Error(
39
+ "SQLite refresh worker did not return a valid schema receipt for this destination",
40
+ );
41
+ }
9
42
 
10
43
  async function rebuildPersistentDatabaseInWorker(workspaceRoot: string, destination: string) {
11
44
  const scriptCandidates = [
@@ -24,6 +57,8 @@ async function rebuildPersistentDatabaseInWorker(workspaceRoot: string, destinat
24
57
  throw new Error("SQLite refresh worker script is unavailable from this runtime checkout");
25
58
  await new Promise<void>((resolveWorker, rejectWorker) => {
26
59
  let stderr = "";
60
+ let stdout = "";
61
+ let oversizedReceipt = false;
27
62
  const worker = spawn(process.execPath, [script], {
28
63
  cwd: workspaceRoot,
29
64
  env: {
@@ -33,13 +68,18 @@ async function rebuildPersistentDatabaseInWorker(workspaceRoot: string, destinat
33
68
  ZAIP_SQLITE_PREFER_LAST_VALID_SEED: "0",
34
69
  ZAIP_DASHBOARD_LAUNCH_PROGRESS: "0",
35
70
  },
36
- stdio: ["ignore", "ignore", "pipe"],
71
+ stdio: ["ignore", "pipe", "pipe"],
37
72
  windowsHide: true,
38
73
  });
39
74
  // Lease shutdown may end the serving parent while a slow snapshot rebuild
40
75
  // is still writing. Terminate the direct child synchronously during parent
41
76
  // exit so the next launcher cannot overlap the persistent SQLite writer.
42
77
  const cleanupWorker = attachRefreshWorkerCleanup(worker);
78
+ worker.stdout?.setEncoding("utf8");
79
+ worker.stdout?.on("data", (chunk: string) => {
80
+ if (stdout.length + chunk.length > 64_000) oversizedReceipt = true;
81
+ if (!oversizedReceipt) stdout += chunk;
82
+ });
43
83
  worker.stderr?.setEncoding("utf8");
44
84
  worker.stderr?.on("data", (chunk: string) => {
45
85
  stderr = `${stderr}${chunk}`.slice(-8_000);
@@ -48,13 +88,22 @@ async function rebuildPersistentDatabaseInWorker(workspaceRoot: string, destinat
48
88
  cleanupWorker();
49
89
  rejectWorker(error);
50
90
  });
51
- worker.once("exit", (code) => {
91
+ // close follows stdout drain; exit alone may precede the receipt bytes.
92
+ worker.once("close", (code) => {
52
93
  cleanupWorker();
53
- return code === 0
54
- ? resolveWorker()
55
- : rejectWorker(
56
- new Error(`SQLite refresh worker failed (${code}): ${stderr.trim() || "no stderr"}`),
57
- );
94
+ if (code !== 0) {
95
+ rejectWorker(
96
+ new Error(`SQLite refresh worker failed (${code}): ${stderr.trim() || "no stderr"}`),
97
+ );
98
+ return;
99
+ }
100
+ try {
101
+ if (oversizedReceipt) throw new Error("SQLite refresh worker receipt exceeds size limit");
102
+ validateSnapshotWorkerReceipt(stdout, destination);
103
+ resolveWorker();
104
+ } catch (error) {
105
+ rejectWorker(error);
106
+ }
58
107
  });
59
108
  });
60
109
  }
@@ -88,6 +137,7 @@ export async function refreshSqliteSnapshotInWorker(
88
137
  ) {
89
138
  const destination = sqliteReadModelPath(workspaceRoot);
90
139
  await rebuildPersistentDatabaseInWorker(workspaceRoot, destination);
91
- validateSqliteReadModelSchema(destination);
140
+ // Integrity/schema checking belongs to the worker, not the HTTP event loop.
141
+ // Zero exit alone is insufficient: its exact-destination receipt is mandatory.
92
142
  filesystem.refresh();
93
143
  }
@@ -19,6 +19,32 @@ afterEach(() => {
19
19
  });
20
20
 
21
21
  describe("snapshot source synchronization", () => {
22
+ it("reports capture failure separately while refreshing canonical data", async () => {
23
+ vi.useFakeTimers();
24
+ const error = new Error("capture timed out");
25
+ const onCaptureFailure = vi.fn();
26
+ const onRefreshFailure = vi.fn();
27
+ const onCaptureSuccess = vi.fn();
28
+ const capture = vi.fn().mockRejectedValueOnce(error).mockResolvedValue(undefined);
29
+ const refresh = vi.fn(async () => undefined);
30
+ startSnapshotSynchronization({
31
+ workspaceRoot: "C:/workspace",
32
+ staleSeed: false,
33
+ watchSources: true,
34
+ refresh,
35
+ captureActiveTelemetry: capture,
36
+ onCaptureFailure,
37
+ onCaptureSuccess,
38
+ onRefreshFailure,
39
+ });
40
+ await vi.advanceTimersByTimeAsync(301);
41
+ expect(onCaptureFailure).toHaveBeenCalledWith(error);
42
+ expect(onRefreshFailure).not.toHaveBeenCalled();
43
+ expect(refresh).toHaveBeenCalledTimes(1);
44
+ await vi.advanceTimersByTimeAsync(60_000);
45
+ expect(onCaptureSuccess).toHaveBeenCalledTimes(1);
46
+ expect(refresh).toHaveBeenCalledTimes(2);
47
+ });
22
48
  it("watches current data for both creation and alteration refreshes", async () => {
23
49
  vi.useFakeTimers();
24
50
  const refresh = vi.fn(async () => undefined);
@@ -38,4 +64,22 @@ describe("snapshot source synchronization", () => {
38
64
  await vi.advanceTimersByTimeAsync(300);
39
65
  expect(refresh).toHaveBeenCalledTimes(2);
40
66
  });
67
+
68
+ it("reports failed refreshes with their observable trigger", async () => {
69
+ vi.useFakeTimers();
70
+ const onRefreshFailure = vi.fn();
71
+ startSnapshotSynchronization({
72
+ workspaceRoot: "C:/workspace",
73
+ staleSeed: true,
74
+ watchSources: false,
75
+ refresh: async () => {
76
+ throw new Error("read model unavailable");
77
+ },
78
+ onRefreshFailure,
79
+ });
80
+ await vi.runAllTimersAsync();
81
+ expect(onRefreshFailure).toHaveBeenCalledWith(
82
+ expect.objectContaining({ trigger: "stale_seed", error: expect.any(Error) }),
83
+ );
84
+ });
41
85
  });
@@ -6,15 +6,23 @@ export function startSnapshotSynchronization(input: {
6
6
  staleSeed: boolean;
7
7
  watchSources: boolean;
8
8
  refresh: () => Promise<void>;
9
+ /** Exact active-Codex collection, separate from projection and lifecycle repair. */
10
+ captureActiveTelemetry?: () => Promise<void>;
11
+ onCaptureFailure?: (error: unknown) => void;
12
+ onCaptureSuccess?: () => void;
13
+ /** Report failed asynchronous refreshes; a stale snapshot must never look healthy. */
14
+ onRefreshFailure?: (input: { trigger: "stale_seed" | "source_change"; error: unknown }) => void;
9
15
  }): void {
10
- if (input.staleSeed) void input.refresh().catch(() => undefined);
16
+ const refresh = (trigger: "stale_seed" | "source_change") =>
17
+ void input.refresh().catch((error: unknown) => input.onRefreshFailure?.({ trigger, error }));
18
+ if (input.staleSeed) refresh("stale_seed");
11
19
  if (!input.watchSources || process.env.ZAIP_DASHBOARD_WATCH_SOURCES === "0") return;
12
20
  let pendingRefresh: NodeJS.Timeout | undefined;
13
21
  const scheduleRefresh = () => {
14
22
  if (pendingRefresh !== undefined) clearTimeout(pendingRefresh);
15
23
  pendingRefresh = setTimeout(() => {
16
24
  pendingRefresh = undefined;
17
- void input.refresh().catch(() => undefined);
25
+ refresh("source_change");
18
26
  }, 300);
19
27
  pendingRefresh.unref();
20
28
  };
@@ -30,6 +38,17 @@ export function startSnapshotSynchronization(input: {
30
38
  // Reuse-triggered refresh remains the portable fallback.
31
39
  }
32
40
  }
33
- const freshnessTimer = setInterval(scheduleRefresh, 60_000);
41
+ const captureAndRefresh = () => {
42
+ if (input.captureActiveTelemetry === undefined) return scheduleRefresh();
43
+ void input
44
+ .captureActiveTelemetry()
45
+ .then(() => input.onCaptureSuccess?.())
46
+ .catch((error: unknown) => input.onCaptureFailure?.(error))
47
+ .finally(scheduleRefresh);
48
+ };
49
+ // Run at most once a minute. File watchers only project canonical changes;
50
+ // they never launch telemetry or lifecycle work.
51
+ captureAndRefresh();
52
+ const freshnessTimer = setInterval(captureAndRefresh, 60_000);
34
53
  freshnessTimer.unref();
35
54
  }
@@ -45,7 +45,7 @@ describe("dashboard backend snapshot", () => {
45
45
  [
46
46
  "lock_version: 1",
47
47
  "framework:",
48
- " version: 2.2.0",
48
+ " version: 2.5.0",
49
49
  " distribution_sha256: null",
50
50
  "layout:",
51
51
  " version: 3",
@@ -357,7 +357,9 @@ describe("dashboard backend snapshot", () => {
357
357
  );
358
358
 
359
359
  try {
360
- const app = createDashboardApp(fixtureRoot, "test-session");
360
+ const app = createDashboardApp(fixtureRoot, "test-session", undefined, {
361
+ reconcileOpenWork: async () => ({ reconciled_ids: [], blocked: [], not_reconciled: [] }),
362
+ });
361
363
  const allCosts = await app.request("/api/v2/cost-monitor?currency=BRL", {
362
364
  headers: { "x-zaip-session": "test-session" },
363
365
  });
@@ -448,7 +450,9 @@ describe("dashboard backend snapshot", () => {
448
450
  };
449
451
  };
450
452
  };
451
- const julyOperationsPayload = (await julyOperations.json()) as { runs: OperationRunMetric[] };
453
+ const _julyOperationsPayload = (await julyOperations.json()) as {
454
+ runs: OperationRunMetric[];
455
+ };
452
456
  const allCostsPayload = (await allCosts.json()) as CostSummaryPayload;
453
457
  const julyCostsPayload = (await monthlyCosts.json()) as CostSummaryPayload;
454
458
  expect(allCostsPayload).toMatchObject({ readonly: true, aggregate_only: true });
@@ -456,7 +460,7 @@ describe("dashboard backend snapshot", () => {
456
460
  const portableAllCostsPayload = (await portableAllCosts.json()) as CostSummaryPayload;
457
461
  const portableJulyCostsPayload = (await portableJulyCosts.json()) as CostSummaryPayload;
458
462
  const quickOperationsPayload = (await quickOperations.json()) as QuickOperationsPayload;
459
- const runIds = (rows: readonly { id: string }[] | readonly { run_id: string }[]) =>
463
+ const _runIds = (rows: readonly { id: string }[] | readonly { run_id: string }[]) =>
460
464
  rows.map((row) => ("id" in row ? row.id : row.run_id)).sort();
461
465
  // scope=summary is intentionally aggregate-only: no Run/Sub-Run payload
462
466
  // is loaded or returned. Detail parity remains covered by Operations.
@@ -480,13 +484,13 @@ describe("dashboard backend snapshot", () => {
480
484
  expect(cost, `missing Cost bucket ${day}`).toBeDefined();
481
485
  expect(period.usage.cost.known_sum, `Operations cost ${day}`).toBeGreaterThan(0);
482
486
  expect(period.duration?.known_sum, `Operations duration ${day}`).toBeGreaterThan(0);
483
- expect(cost!.estimated_brl, `Cost cost ${day}`).toBeGreaterThan(0);
484
- expect(cost!.duration_ms, `Cost duration ${day}`).toBeGreaterThan(0);
485
- expect(period.usage.total_tokens.known_sum).toBe(cost!.total_tokens);
486
- expect(period.usage.cost.known_sum).toBe(cost!.estimated_brl);
487
- expect(period.duration?.known_sum).toBe(cost!.duration_ms);
487
+ expect(cost?.estimated_brl, `Cost cost ${day}`).toBeGreaterThan(0);
488
+ expect(cost?.duration_ms, `Cost duration ${day}`).toBeGreaterThan(0);
489
+ expect(period.usage.total_tokens.known_sum).toBe(cost?.total_tokens);
490
+ expect(period.usage.cost.known_sum).toBe(cost?.estimated_brl);
491
+ expect(period.duration?.known_sum).toBe(cost?.duration_ms);
488
492
  }
489
- const rootOperations = allOperationsPayload.runs.find(
493
+ const _rootOperations = allOperationsPayload.runs.find(
490
494
  (run) => run.id === "RUN-2026-07-14-00-00-DASHBOARD-FIXTURE-A1B2",
491
495
  );
492
496
  expect(
@@ -520,6 +524,8 @@ describe("dashboard backend snapshot", () => {
520
524
  },
521
525
  projection: {
522
526
  source_latest_at: "2026-07-14T00:00:05.000Z",
527
+ updated_at: null,
528
+ latest_token_collected_at: null,
523
529
  served_at: expect.any(String),
524
530
  },
525
531
  });
@@ -567,7 +573,7 @@ describe("dashboard backend snapshot", () => {
567
573
 
568
574
  describe("Cost Monitor daily summary route", () => {
569
575
  it("does not route summary requests through summary.json, snapshots, or Run transport", () => {
570
- const source = readFileSync(new URL("./server.ts", import.meta.url), "utf8");
576
+ const source = readFileSync(new URL("./server-costs-routes.ts", import.meta.url), "utf8");
571
577
  const start = source.indexOf('if (scope === "summary")');
572
578
  const end = source.indexOf('if (scope === "runs")', start);
573
579
  const summaryRoute = source.slice(start, end);
@@ -580,9 +586,9 @@ describe("Cost Monitor daily summary route", () => {
580
586
  });
581
587
 
582
588
  it("uses only the bounded SQL aggregate for the Cost first fold", () => {
583
- const source = readFileSync(new URL("./server.ts", import.meta.url), "utf8");
589
+ const source = readFileSync(new URL("./server-read-projections.ts", import.meta.url), "utf8");
584
590
  const start = source.indexOf("async function firstFoldCostSource(");
585
- const end = source.indexOf("export function createDashboardApp(", start);
591
+ const end = source.indexOf("export async function dashboardSnapshot(", start);
586
592
  expect(start).toBeGreaterThanOrEqual(0);
587
593
  expect(end).toBeGreaterThan(start);
588
594
  const firstFoldCostSource = source.slice(start, end);
@@ -593,14 +599,9 @@ describe("Cost Monitor daily summary route", () => {
593
599
  });
594
600
 
595
601
  it("keeps the Daily first-fold response to its displayed-column allowlist", () => {
596
- const source = readFileSync(new URL("./sqlite-read-model.ts", import.meta.url), "utf8");
597
- const dailyBranch = source.slice(
598
- source.indexOf(
599
- "if (filteredCostGroup !== undefined && temporalCostGroup && !hasDimensionalCostFilter)",
600
- ),
601
- source.indexOf(
602
- "if (filteredCostGroup !== undefined && (!temporalCostGroup || hasDimensionalCostFilter))",
603
- ),
602
+ const dailyBranch = readFileSync(
603
+ new URL("./sqlite-query-temporal-dimension.ts", import.meta.url),
604
+ "utf8",
604
605
  );
605
606
  expect(dailyBranch).not.toContain("costMonitorFactualDurationByDay(");
606
607
  expect(dailyBranch).toContain("Daily first fold is an allowlisted table contract");
@@ -0,0 +1,97 @@
1
+ import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
2
+ import { tmpdir } from "node:os";
3
+ import { dirname, join } from "node:path";
4
+ import { createV2WorkspaceLayout } from "@zaip-ai/core";
5
+ import { afterEach, expect, it, vi } from "vitest";
6
+ import { buildSqliteTaskTrace } from "./server-sqlite-task-trace.js";
7
+ import { rebuildSqliteReadModel, SqliteReadModelFileSystem } from "./sqlite-read-model.js";
8
+ import { prepareMultiProviderFixture } from "./sqlite-read-model-multi-provider-fixture.js";
9
+
10
+ const roots: string[] = [];
11
+ const readers: SqliteReadModelFileSystem[] = [];
12
+ afterEach(async () => {
13
+ vi.restoreAllMocks();
14
+ for (const reader of readers.splice(0)) reader.close();
15
+ await Promise.all(roots.splice(0).map((root) => rm(root, { recursive: true, force: true })));
16
+ });
17
+ const taskId = "TASK-2026-09-10-12-00-TRACE-AAAA";
18
+ const layout = createV2WorkspaceLayout(
19
+ {
20
+ schema_version: 1,
21
+ project: { id: "trace", name: "Trace", timezone: "America/Sao_Paulo" },
22
+ stack: { id: "zaip-aios-stack", overrides: {} },
23
+ clients: { codex: true, claude: false },
24
+ tracking: { enabled: true, currency: "BRL", storage_mode: "tracked_sanitized" },
25
+ },
26
+ {
27
+ lock_version: 2,
28
+ framework: { version: "3.0.0", distribution_sha256: null },
29
+ layout: { version: 3 },
30
+ resolved_profile: { id: null, sha256: null },
31
+ managed_files: {},
32
+ },
33
+ );
34
+ const taskContent = (id: string, title: string) =>
35
+ `---\nid: ${id}\ntitle: ${title}\nstatus: completed\nrisk: standard\ncreated_at: 2026-09-10T15:00:00.000Z\n---\n# ${title}\n`;
36
+ async function fixture(files: Record<string, string>) {
37
+ const root = await mkdtemp(join(tmpdir(), "zaip-trace-bounded-"));
38
+ roots.push(root);
39
+ await prepareMultiProviderFixture(root);
40
+ for (const [path, content] of Object.entries(files)) {
41
+ const target = join(root, path);
42
+ await mkdir(dirname(target), { recursive: true });
43
+ await writeFile(target, content);
44
+ }
45
+ await rebuildSqliteReadModel(root);
46
+ const filesystem = new SqliteReadModelFileSystem(root);
47
+ readers.push(filesystem);
48
+ return filesystem;
49
+ }
50
+
51
+ it("resolves the exact Task and filters oversized history before transport without losing documents", async () => {
52
+ const path = layout.activePath("task", taskId);
53
+ const small = ".agents/records/changes/trace/artifacts/tests/notes.md";
54
+ const large = ".agents/records/changes/trace/artifacts/tests/oversized.md";
55
+ const astral = ".agents/records/changes/trace/artifacts/tests/astral.md";
56
+ const shadowId = "TASK-2026-09-10-11-00-SHADOW-AAAA";
57
+ const filesystem = await fixture({
58
+ [path]: taskContent(taskId, "Requested Task"),
59
+ [layout.activePath("task", shadowId)]: taskContent(shadowId, `References ${taskId}`),
60
+ [small]: `# ${taskId}\n${"x".repeat(250_000 - taskId.length - 3)}`,
61
+ [large]: `${taskId}\n${"x".repeat(250_001)}`,
62
+ [astral]: `${taskId}\n${"😀".repeat(130_000)}`,
63
+ });
64
+ const expected = filesystem
65
+ .canonicalTraceFiles([taskId])
66
+ .filter((row) => row.content.length <= 250_000)
67
+ .map((row) => row.path);
68
+ expect(expected).toContain(small);
69
+ expect(expected).not.toContain(large);
70
+ expect(expected).not.toContain(astral);
71
+ const scan = vi.spyOn(filesystem, "canonicalTraceFiles");
72
+ const trace = await buildSqliteTaskTrace(filesystem, layout, taskId);
73
+ expect(trace.task_title).toBe("Requested Task");
74
+ expect(trace.task_id).toBe(taskId);
75
+ expect(trace.documents.map((row) => row.path)).toEqual(expected);
76
+ expect(scan).toHaveBeenCalledOnce();
77
+ expect(scan.mock.calls[0]?.[1]).toBe(250_000);
78
+ expect(scan.mock.results[0]?.value.map((row: { path: string }) => row.path)).not.toContain(large);
79
+ });
80
+
81
+ it("rejects a mismatched Task identity instead of tracing a document that mentions it", async () => {
82
+ const filesystem = await fixture({
83
+ [layout.activePath("task", taskId)]: taskContent("TASK-2026-09-10-11-00-WRONG-AAAA", taskId),
84
+ });
85
+ await expect(buildSqliteTaskTrace(filesystem, layout, taskId)).rejects.toThrow(
86
+ /identity mismatch/,
87
+ );
88
+ });
89
+
90
+ it("retains the canonical divergent-layout guard and rejects invalid bounds", async () => {
91
+ const filesystem = await fixture({
92
+ [layout.activePath("task", taskId)]: taskContent(taskId, "Active"),
93
+ [`.agents/data/tasks/2026/09/10/${taskId}.md`]: taskContent(taskId, "Divergent"),
94
+ });
95
+ await expect(buildSqliteTaskTrace(filesystem, layout, taskId)).rejects.toThrow(/Divergent/);
96
+ expect(() => filesystem.canonicalTraceFiles([taskId], -1)).toThrow(/Invalid trace content bound/);
97
+ });
@@ -1,5 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
- import type { WorkspaceLayout } from "@zaip-ai/core";
2
+ import { resolveArtifactReadPath, type WorkspaceLayout } from "@zaip-ai/core";
3
3
  import type { TaskTrace, TraceDocument } from "@zaip-ai/dashboard-traceability/contracts";
4
4
  import {
5
5
  buildTraceStageRecords,
@@ -8,26 +8,23 @@ import {
8
8
  } from "@zaip-ai/dashboard-traceability/server";
9
9
  import type { SqliteReadModelFileSystem } from "./sqlite-read-model.js";
10
10
 
11
- export function buildSqliteTaskTrace(
11
+ export async function buildSqliteTaskTrace(
12
12
  filesystem: SqliteReadModelFileSystem,
13
13
  layout: WorkspaceLayout,
14
14
  taskId: string,
15
- ): TaskTrace {
16
- const initial = filesystem.canonicalTraceFiles([taskId]);
17
- const taskFile = initial.find(
18
- (row) =>
19
- row.path.includes("/.agents/data/tasks/") ||
20
- row.path.includes(".agents/data/tasks/") ||
21
- row.path.includes("/.agents/records/tasks/") ||
22
- row.path.includes(".agents/records/tasks/"),
23
- );
24
- if (taskFile === undefined) throw new Error(`Canonical Task ${taskId} was not found`);
15
+ ): Promise<TaskTrace> {
16
+ // Resolve the exact canonical identity, not the first Task mentioning it.
17
+ // This also avoids scanning all historical contents just to locate one Task.
18
+ const taskPath = await resolveArtifactReadPath(filesystem, layout, "task", taskId);
19
+ if (taskPath === null) throw new Error(`Canonical Task ${taskId} was not found`);
20
+ const taskFile = { path: taskPath, content: await filesystem.readText(taskPath) };
25
21
  const scalar = (key: string): string | null => {
26
22
  const frontMatter = /^---\r?\n([\s\S]*?)\r?\n---/.exec(taskFile.content)?.[1] ?? "";
27
23
  const value = new RegExp(`^${key}:\\s*(.+?)\\s*$`, "m").exec(frontMatter)?.[1]?.trim();
28
24
  if (value === undefined || value === "null") return null;
29
25
  return value.replace(/^['"]|['"]$/g, "");
30
26
  };
27
+ if (scalar("id") !== taskId) throw new Error(`Canonical Task identity mismatch: ${taskId}`);
31
28
  const relatedId = (key: string, prefix: string): string | null =>
32
29
  scalar(key) ?? new RegExp(`\\b${prefix}[A-Z0-9-]+`).exec(taskFile.content)?.[0] ?? null;
33
30
  const changeId = relatedId("change_id", "CHG-") ?? taskId;
@@ -37,7 +34,7 @@ export function buildSqliteTaskTrace(
37
34
  (value): value is string => value !== null,
38
35
  );
39
36
  const documents = filesystem
40
- .canonicalTraceFiles(markers)
37
+ .canonicalTraceFiles(markers, 250_000)
41
38
  .filter(
42
39
  (row) => /\.(?:md|json|jsonl|txt|log)$/i.test(row.path) && row.content.length <= 250_000,
43
40
  )
@@ -0,0 +1,25 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { createDashboardApp } from "./server.js";
3
+ import { withSqliteReadModelFixture } from "./server.test-fixtures.js";
4
+
5
+ describe("SQLite view HTTP allowlist", () => {
6
+ it("rejects inherited object names before invoking SQLite and accepts an owned view", async () => {
7
+ await withSqliteReadModelFixture("view-allowlist", async ({ root, filesystem }) => {
8
+ const viewPage = vi.spyOn(filesystem, "viewPage");
9
+ const app = createDashboardApp(root, "test-session", undefined, { filesystem });
10
+ for (const view of ["constructor", "toString", "__proto__"]) {
11
+ const response = await app.request(`/api/v2/sqlite-views?view=${view}`, {
12
+ headers: { "x-zaip-session": "test-session" },
13
+ });
14
+ expect(response.status).toBe(400);
15
+ await expect(response.json()).resolves.toEqual({ error: "Unsupported SQLite view" });
16
+ }
17
+ expect(viewPage).not.toHaveBeenCalled();
18
+ const response = await app.request("/api/v2/sqlite-views?view=first_fold_top_tasks", {
19
+ headers: { "x-zaip-session": "test-session" },
20
+ });
21
+ expect(response.status, await response.clone().text()).toBe(200);
22
+ expect(viewPage).toHaveBeenCalledWith("first_fold_top_tasks", expect.any(Object));
23
+ });
24
+ });
25
+ });
@@ -0,0 +1,56 @@
1
+ import {
2
+ readPrdDetail,
3
+ readSpecDetail,
4
+ readTaskDetail,
5
+ } from "@zaip-ai/dashboard-operations/server";
6
+ import { buildTaskTrace } from "@zaip-ai/dashboard-traceability/server";
7
+ import type { Hono } from "hono";
8
+ import { API_PREFIX, headOrJson, V2WorkspaceRequiredError } from "./server-http-contracts.js";
9
+ import type { DashboardRouteContext } from "./server-route-context.js";
10
+ import { buildSqliteTaskTrace } from "./server-sqlite-task-trace.js";
11
+ import { SqliteReadModelFileSystem } from "./sqlite-read-model.js";
12
+ export function registerTraceRoutes(app: Hono, dependencies: DashboardRouteContext) {
13
+ const { filesystem, readLayout } = dependencies;
14
+ app.on(["GET", "HEAD"], `${API_PREFIX}/tasks/:id`, async (context) => {
15
+ try {
16
+ const layout = await readLayout();
17
+ return headOrJson(context, await readTaskDetail(filesystem, layout, context.req.param("id")));
18
+ } catch (error) {
19
+ if (error instanceof V2WorkspaceRequiredError) throw error;
20
+ return headOrJson(context, { error: "Task not found" }, 404);
21
+ }
22
+ });
23
+ app.on(["GET", "HEAD"], `${API_PREFIX}/prds/:id`, async (context) => {
24
+ try {
25
+ const layout = await readLayout();
26
+ return headOrJson(context, await readPrdDetail(filesystem, layout, context.req.param("id")));
27
+ } catch (error) {
28
+ if (error instanceof V2WorkspaceRequiredError) throw error;
29
+ return headOrJson(context, { error: "PRD not found" }, 404);
30
+ }
31
+ });
32
+ app.on(["GET", "HEAD"], `${API_PREFIX}/specs/:id`, async (context) => {
33
+ try {
34
+ const layout = await readLayout();
35
+ return headOrJson(context, await readSpecDetail(filesystem, layout, context.req.param("id")));
36
+ } catch (error) {
37
+ if (error instanceof V2WorkspaceRequiredError) throw error;
38
+ return headOrJson(context, { error: "SPEC not found" }, 404);
39
+ }
40
+ });
41
+ app.on(["GET", "HEAD"], `${API_PREFIX}/tasks/:id/trace`, async (context) => {
42
+ try {
43
+ const layout = await readLayout();
44
+ const taskId = context.req.param("id");
45
+ return headOrJson(
46
+ context,
47
+ filesystem instanceof SqliteReadModelFileSystem
48
+ ? await buildSqliteTaskTrace(filesystem, layout, taskId)
49
+ : await buildTaskTrace(filesystem, layout, taskId),
50
+ );
51
+ } catch (error) {
52
+ if (error instanceof V2WorkspaceRequiredError) throw error;
53
+ return headOrJson(context, { error: "Task trace not found" }, 404);
54
+ }
55
+ });
56
+ }
@@ -0,0 +1,84 @@
1
+ import { serializeMarkdown, WorkspaceFileSystem } from "@zaip-ai/core";
2
+ import { expect, it } from "vitest";
3
+ import { createDashboardApp } from "./server.js";
4
+ import { withSqliteReadModelFixture } from "./server.test-fixtures.js";
5
+ import { rebuildSqliteReadModel, SqliteReadModelFileSystem } from "./sqlite-read-model.js";
6
+
7
+ it("indexes draft and terminal Tasks in SQLite without adding drafts to Kanban", async () => {
8
+ await withSqliteReadModelFixture("trace-index", async ({ root }) => {
9
+ const at = "2026-09-11T10:00:00.000Z";
10
+ const canonical = new WorkspaceFileSystem(root);
11
+ for (const [i, status] of ["draft", "cancelled", "blocked"].entries()) {
12
+ await canonical.writeTextAtomic(
13
+ `.agents/records/tasks/2026/09/task-${i}.md`,
14
+ serializeMarkdown({
15
+ metadata: {
16
+ schema_version: 2,
17
+ id: `TASK-INDEX-${i}`,
18
+ title: `Task ${status}`,
19
+ status,
20
+ revision: 1,
21
+ change_id: `CHG-INDEX-${i}`,
22
+ short_name: `index-${i}`,
23
+ objective: "Identity fixture",
24
+ risk: "standard",
25
+ priority: "medium",
26
+ owner: null,
27
+ requirement_ids: ["REQ-WORK-001"],
28
+ acceptance_ids: ["AC-WORK-001-09"],
29
+ depends_on: [],
30
+ write_scopes: ["proof"],
31
+ plan_revision: null,
32
+ plan_hash: null,
33
+ created_at: at,
34
+ updated_at: at,
35
+ started_at: null,
36
+ finished_at: null,
37
+ result: null,
38
+ },
39
+ body: "# Identity fixture\n",
40
+ }),
41
+ );
42
+ }
43
+ await rebuildSqliteReadModel(root);
44
+ const sqlite = new SqliteReadModelFileSystem(root);
45
+ try {
46
+ const app = createDashboardApp(root, "fixture", undefined, { filesystem: sqlite });
47
+ const request = async (query: string) => {
48
+ const response = await app.request(`/api/v2/operations?${query}`, {
49
+ headers: { "x-zaip-session": "fixture" },
50
+ });
51
+ expect(response.status).toBe(200);
52
+ return response.json() as Promise<{
53
+ total: number;
54
+ tasks: { id: string; status: string }[];
55
+ }>;
56
+ };
57
+ const first = await request("scope=traceability&offset=0&limit=2");
58
+ const second = await request("scope=traceability&offset=2&limit=2");
59
+ expect(first.total).toBe(3);
60
+ expect(first.tasks).toHaveLength(2);
61
+ expect(second.tasks).toHaveLength(1);
62
+ expect([...first.tasks, ...second.tasks].map((task) => task.id)).toEqual([
63
+ "TASK-INDEX-2",
64
+ "TASK-INDEX-1",
65
+ "TASK-INDEX-0",
66
+ ]);
67
+ expect(second.tasks[0]?.status).toBe("draft");
68
+ for (const stage of [
69
+ "definition",
70
+ "planning",
71
+ "ready",
72
+ "executing",
73
+ "completed",
74
+ "blocked",
75
+ ]) {
76
+ const board = await request(`scope=board&stage=${stage}&kind=all-tasks`);
77
+ expect(board.tasks.map((task: { id: string }) => task.id)).not.toContain("TASK-INDEX-0");
78
+ }
79
+ expect((await request("scope=traceability&offset=3&limit=2")).tasks).toEqual([]);
80
+ } finally {
81
+ sqlite.close();
82
+ }
83
+ });
84
+ });