@zaip-ai/cli 2.6.0 → 3.1.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 (312) 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 +5 -2
  5. package/dist/services/adapters.js.map +1 -1
  6. package/dist/services/agent-adapters.js +12 -9
  7. package/dist/services/agent-adapters.js.map +1 -1
  8. package/dist/services/codex-conversation-lifecycle-hook.d.ts.map +1 -1
  9. package/dist/services/codex-conversation-lifecycle-hook.js +32 -21
  10. package/dist/services/codex-conversation-lifecycle-hook.js.map +1 -1
  11. package/dist/services/install-agents-template.js +9 -1
  12. package/dist/services/install-agents-template.js.map +1 -1
  13. package/dist/services/runtime-template.test.js +25 -2
  14. package/dist/services/runtime-template.test.js.map +1 -1
  15. package/dist/services/transactional-files.d.ts.map +1 -1
  16. package/dist/services/transactional-files.js +59 -14
  17. package/dist/services/transactional-files.js.map +1 -1
  18. package/package.json +1 -1
  19. package/templates/.agents/README-ENG.md +75 -10
  20. package/templates/.agents/README.md +76 -10
  21. package/templates/.agents/config/agents/catalog.yaml +3 -0
  22. package/templates/.agents/config/agents/discovery.json +2 -2
  23. package/templates/.agents/config/clients/codex/agents/zaip-agent-analyst.toml +1 -1
  24. package/templates/.agents/config/clients/codex/agents/zaip-agent-auditor.toml +1 -1
  25. package/templates/.agents/config/clients/codex/agents/zaip-agent-backend.toml +1 -1
  26. package/templates/.agents/config/clients/codex/agents/zaip-agent-brand-strategist.toml +1 -1
  27. package/templates/.agents/config/clients/codex/agents/zaip-agent-builder.toml +1 -1
  28. package/templates/.agents/config/clients/codex/agents/zaip-agent-cloud-engineer.toml +1 -1
  29. package/templates/.agents/config/clients/codex/agents/zaip-agent-data-analyst.toml +1 -1
  30. package/templates/.agents/config/clients/codex/agents/zaip-agent-designer.toml +1 -1
  31. package/templates/.agents/config/clients/codex/agents/zaip-agent-finalizer.toml +2 -2
  32. package/templates/.agents/config/clients/codex/agents/zaip-agent-frontend.toml +1 -1
  33. package/templates/.agents/config/clients/codex/agents/zaip-agent-general-operations.toml +1 -1
  34. package/templates/.agents/config/clients/codex/agents/zaip-agent-governance-compliance.toml +1 -1
  35. package/templates/.agents/config/clients/codex/agents/zaip-agent-growth-strategist.toml +1 -1
  36. package/templates/.agents/config/clients/codex/agents/zaip-agent-integrator.toml +1 -1
  37. package/templates/.agents/config/clients/codex/agents/zaip-agent-marketing-analyst.toml +1 -1
  38. package/templates/.agents/config/clients/codex/agents/zaip-agent-orchestrator.toml +13 -10
  39. package/templates/.agents/config/clients/codex/agents/zaip-agent-refactoring-specialist.toml +1 -1
  40. package/templates/.agents/config/clients/codex/agents/zaip-agent-reviewer.toml +1 -1
  41. package/templates/.agents/config/clients/codex/agents/zaip-agent-sales-specialist.toml +1 -1
  42. package/templates/.agents/config/clients/codex/agents/zaip-agent-security-auditor.toml +1 -1
  43. package/templates/.agents/config/clients/codex/agents/zaip-agent-task-executor.toml +1 -1
  44. package/templates/.agents/config/clients/codex/agents/zaip-agent-website-developer.toml +1 -1
  45. package/templates/.agents/config/clients/codex/agents/zaip-agent-writer.toml +1 -1
  46. package/templates/.agents/config/project.yaml +10 -1
  47. package/templates/.agents/dashboard/.zaip-managed.json +274 -138
  48. package/templates/.agents/dashboard/README.md +16 -0
  49. package/templates/.agents/dashboard/apps/frontend/dist/assets/{CostCalculationGuidePage-CGxeQak4.js → CostCalculationGuidePage-CEDZjl4V.js} +1 -1
  50. package/templates/.agents/dashboard/apps/frontend/dist/assets/{DashboardHelpDialog-tzS7YxYB.js → DashboardHelpDialog-DIWDmvAS.js} +930 -550
  51. package/templates/.agents/dashboard/apps/frontend/dist/assets/{PricingSettingsDialog-DEbCi1gP.js → PricingSettingsDialog-BBRBKaHa.js} +1 -1
  52. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-B9GWkEyN.css +1 -0
  53. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-BAvLPAee.js +3 -0
  54. package/templates/.agents/dashboard/apps/frontend/dist/assets/{TraceabilityWorkspace-t1Om0Abw.js → TraceabilityWorkspace-C9dDhj34.js} +1 -1
  55. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-06__WZco.js +68 -0
  56. package/templates/.agents/dashboard/apps/frontend/dist/assets/dashboard-localization-CoAVMZN6.js +828 -0
  57. package/templates/.agents/dashboard/apps/frontend/dist/assets/{icons-vendor-DiGC-dsJ.js → icons-vendor-DEmo6Tn2.js} +1 -1
  58. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-BVzw_Wux.js +2 -0
  59. package/templates/.agents/dashboard/apps/frontend/dist/assets/{react-vendor-kPO6yNed.js → react-vendor-CadYsm83.js} +1 -1
  60. package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-BzKK8kK3.js +1 -0
  61. package/templates/.agents/dashboard/apps/frontend/dist/index.html +5 -5
  62. package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
  63. package/templates/.agents/dashboard/apps/frontend/src/AppDashboardContent.tsx +10 -5
  64. package/templates/.agents/dashboard/apps/frontend/src/AutonomySettings.tsx +82 -0
  65. package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.dom.test.ts +38 -7
  66. package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.tsx +164 -171
  67. package/templates/.agents/dashboard/apps/frontend/src/__tests__/app-composition-support.ts +6 -1
  68. package/templates/.agents/dashboard/apps/frontend/src/cost-monitor-population.test.tsx +149 -0
  69. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api-settings.ts +2 -1
  70. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.test.ts +19 -0
  71. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +22 -1
  72. package/templates/.agents/dashboard/apps/frontend/src/dashboard-cost-facts.test.ts +54 -0
  73. package/templates/.agents/dashboard/apps/frontend/src/dashboard-cost-facts.ts +20 -2
  74. package/templates/.agents/dashboard/apps/frontend/src/dashboard-localization.test.ts +37 -43
  75. package/templates/.agents/dashboard/apps/frontend/src/dashboard-localization.ts +9 -251
  76. package/templates/.agents/dashboard/apps/frontend/src/dashboard-project-overview.ts +34 -7
  77. package/templates/.agents/dashboard/apps/frontend/src/dashboard-view-actions.test.ts +51 -0
  78. package/templates/.agents/dashboard/apps/frontend/src/dashboard-view-actions.ts +3 -1
  79. package/templates/.agents/dashboard/apps/frontend/src/operations-period-render.test.ts +35 -0
  80. package/templates/.agents/dashboard/apps/frontend/src/operations-period.test.ts +19 -4
  81. package/templates/.agents/dashboard/apps/frontend/src/operations-period.ts +5 -3
  82. package/templates/.agents/dashboard/apps/frontend/src/project-installation-status.test.ts +112 -23
  83. package/templates/.agents/dashboard/apps/frontend/src/project-installation-status.ts +49 -12
  84. package/templates/.agents/dashboard/apps/frontend/src/project-settings-copy.ts +181 -0
  85. package/templates/.agents/dashboard/apps/frontend/src/project-settings-model.ts +11 -1
  86. package/templates/.agents/dashboard/apps/frontend/src/project-settings-page.css +34 -51
  87. package/templates/.agents/dashboard/apps/frontend/src/project-settings-state.css +55 -0
  88. package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +12 -0
  89. package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +1 -1
  90. package/templates/.agents/dashboard/apps/frontend/src/traceability-task-pagination.ts +1 -2
  91. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.test.ts +6 -0
  92. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.ts +2 -0
  93. package/templates/.agents/dashboard/apps/frontend/src/use-app-trace-documents.ts +3 -1
  94. package/templates/.agents/dashboard/apps/frontend/src/use-app-trace-task-pagination.ts +4 -15
  95. package/templates/.agents/dashboard/apps/frontend/src/use-dashboard-app-model.tsx +2 -2
  96. package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
  97. package/templates/.agents/dashboard/modules/cost-monitor/src/complete-cost-average.test.ts +73 -0
  98. package/templates/.agents/dashboard/modules/cost-monitor/src/contracts.ts +9 -0
  99. package/templates/.agents/dashboard/modules/cost-monitor/src/period-averages.ts +60 -0
  100. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorContent.tsx +8 -22
  101. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +2 -3
  102. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostPeriodAverageCards.tsx +32 -8
  103. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-summary.ts +3 -2
  104. package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.ts +1 -42
  105. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.ts +2 -1
  106. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.ts +3 -2
  107. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.ts +8 -2
  108. package/templates/.agents/dashboard/modules/cost-monitor/src/server/index.ts +1 -0
  109. package/templates/.agents/dashboard/modules/operations/package.json +1 -1
  110. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview-keeps-structure-classes-mutually-exclusive.test.ts +4 -3
  111. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.helpers.tsx +66 -3
  112. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.test.ts +71 -1
  113. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.tsx +36 -30
  114. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +5 -14
  115. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageOverview.tsx +3 -0
  116. package/templates/.agents/dashboard/modules/operations/src/react/OverviewCostKpi.tsx +46 -0
  117. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.test.ts +28 -1
  118. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.tsx +11 -4
  119. package/templates/.agents/dashboard/modules/operations/src/react/index.ts +1 -0
  120. package/templates/.agents/dashboard/modules/operations/src/react/operations-coverage-toast.test.ts +2 -2
  121. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview-period-filter.test.ts +28 -8
  122. package/templates/.agents/dashboard/modules/operations/src/react/operations-page-contract.ts +19 -2
  123. package/templates/.agents/dashboard/modules/operations/src/react/overview-cost-card.test.tsx +89 -0
  124. package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.test.ts +3 -3
  125. package/templates/.agents/dashboard/modules/operations/src/work-board-model.ts +2 -1
  126. package/templates/.agents/dashboard/modules/traceability/package.json +1 -1
  127. package/templates/.agents/dashboard/packages/branding/package.json +1 -1
  128. package/templates/.agents/dashboard/packages/contracts/package.json +1 -1
  129. package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
  130. package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +279 -245
  131. package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +247 -215
  132. package/templates/.agents/dashboard/packages/local-runtime/package.json +2 -2
  133. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs +15 -25
  134. package/templates/.agents/dashboard/packages/local-runtime/server.mjs +279 -245
  135. package/templates/.agents/dashboard/packages/local-runtime/src/active-codex-telemetry.ts +1 -1
  136. package/templates/.agents/dashboard/packages/local-runtime/src/project-installation-summary.test.ts +142 -0
  137. package/templates/.agents/dashboard/packages/local-runtime/src/project-installation-summary.ts +190 -0
  138. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +65 -0
  139. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +67 -66
  140. package/templates/.agents/dashboard/packages/local-runtime/src/server-browser-lease.test.ts +91 -0
  141. package/templates/.agents/dashboard/packages/local-runtime/src/server-browser-lease.ts +24 -4
  142. package/templates/.agents/dashboard/packages/local-runtime/src/server-hono-security.test.ts +17 -0
  143. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-routes.ts +21 -2
  144. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-refresh.test.ts +94 -2
  145. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-refresh.ts +62 -12
  146. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-synchronization.test.ts +26 -0
  147. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-synchronization.ts +4 -1
  148. package/templates/.agents/dashboard/packages/local-runtime/src/server-sqlite-task-trace.test.ts +97 -0
  149. package/templates/.agents/dashboard/packages/local-runtime/src/server-sqlite-task-trace.ts +10 -13
  150. package/templates/.agents/dashboard/packages/local-runtime/src/server-trace-routes.ts +2 -10
  151. package/templates/.agents/dashboard/packages/local-runtime/src/server-traceability-index.test.ts +84 -0
  152. package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +15 -1
  153. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-calendar.ts +17 -0
  154. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cold-parse.test.ts +78 -0
  155. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-dimension-facts.test.ts +12 -1
  156. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-group-projection.test.ts +94 -0
  157. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-cost-group-projection.ts +5 -5
  158. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-duration-lookup.test.ts +59 -0
  159. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-entity-label-views.test.ts +72 -0
  160. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-file-index.test.ts +69 -0
  161. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-first-fold-cache.ts +3 -1
  162. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-force-canonical.test.ts +3 -1
  163. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-incremental-refresh.test.ts +2 -0
  164. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-materialize-projections.ts +9 -0
  165. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-materialize-runs.ts +4 -5
  166. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-period-averages.ts +46 -0
  167. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-provider-alias-parity.test.ts +50 -0
  168. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-entity-group.test.ts +171 -0
  169. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-entity-group.ts +36 -16
  170. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-filtered-dimension.ts +13 -2
  171. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-summary.ts +25 -7
  172. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-query-temporal-dimension.ts +2 -0
  173. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-canonical-parsing.ts +7 -0
  174. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-canonical.ts +5 -15
  175. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-counts-every-root-execution-day-returns.test.ts +34 -10
  176. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-filesystem.ts +17 -3
  177. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-keeps-orphan-telemetry-out-kanban-without.test.ts +1 -1
  178. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-rebuild.ts +11 -0
  179. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-schema.ts +5 -4
  180. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-source-fingerprint.test.ts +54 -1
  181. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-source-fingerprint.ts +7 -3
  182. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +4 -1
  183. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-risk-population.test.ts +98 -0
  184. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-schema-base-views.ts +29 -16
  185. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-schema-dashboard-views.ts +2 -1
  186. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-snapshot-seed.test.ts +2 -0
  187. package/templates/.agents/dashboard/packages/local-runtime/src/verify-project-settings.mjs +57 -0
  188. package/templates/.agents/dashboard/packages/ui/package.json +1 -1
  189. package/templates/.agents/dashboard/scripts/qualify-observability.mjs +130 -0
  190. package/templates/.agents/dashboard/scripts/verify-autonomy-settings.mjs +175 -0
  191. package/templates/.agents/dashboard/scripts/verify-observability.mjs +254 -0
  192. package/templates/.agents/dashboard/scripts/verify-project-setup.mjs +64 -0
  193. package/templates/.agents/dashboard/tests/e2e/lease-global-setup.ts +37 -0
  194. package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
  195. package/templates/.agents/dashboard/tests/e2e/playwright.config.ts +5 -3
  196. package/templates/.agents/dashboard/tests/e2e/specs/cost-monitor-period-transition.spec.ts +22 -1
  197. package/templates/.agents/dashboard/tests/e2e/specs/dashboard-performance-matrix.spec.ts +17 -8
  198. package/templates/.agents/dashboard/tests/e2e/specs/dashboard.spec.ts +47 -6
  199. package/templates/.agents/dashboard/tests/e2e/specs/lease-lifetime.spec.ts +14 -0
  200. package/templates/.agents/dashboard/tests/observability-fixture.mjs +200 -0
  201. package/templates/.agents/design/.zaip-managed.json +84 -40
  202. package/templates/.agents/design/apps/catalog/dist/assets/index-BJV597iq.js +72 -0
  203. package/templates/.agents/design/apps/catalog/dist/assets/index-BOjCcUaU.js +72 -0
  204. package/templates/.agents/design/apps/catalog/dist/assets/index-B_WhrCZe.js +72 -0
  205. package/templates/.agents/design/apps/catalog/dist/assets/index-CqtYXZfV.js +72 -0
  206. package/templates/.agents/design/apps/catalog/dist/assets/index-D_lfqoyx.js +72 -0
  207. package/templates/.agents/design/apps/catalog/dist/assets/index-i_PO2k9R.js +9 -0
  208. package/templates/.agents/design/apps/catalog/dist/index.html +1 -1
  209. package/templates/.agents/design/apps/catalog/dist/storybook/assets/CatalogShell-Cstn1UwA.js +1 -0
  210. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{Color-6AOWCN3U-B-kAgAjB.js → Color-6AOWCN3U-Cm-yJJz_.js} +1 -1
  211. package/templates/.agents/design/apps/catalog/dist/storybook/assets/Components.stories-D1WopB2L.js +137 -0
  212. package/templates/.agents/design/apps/catalog/dist/storybook/assets/DesignSystem.stories-DQ9PJ3N3.js +1 -0
  213. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{DocsRenderer-JROSPFPF-BVN7xHtv.js → DocsRenderer-JROSPFPF-Belk4jRr.js} +4 -4
  214. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{WithTooltip-7X4HQR7L-CDHtKYkz.js → WithTooltip-7X4HQR7L-DoPvjkS1.js} +1 -1
  215. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{chunk-DRQKCCAG-D6AsDkMK.js → chunk-DRQKCCAG-B1itKXEN.js} +1 -1
  216. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{chunk-W22LQPXL-B4m5uloN.js → chunk-W22LQPXL-C-Eb5SPY.js} +1 -1
  217. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{components-CN8YyTUg.js → components-DnyKLwhj.js} +5 -5
  218. package/templates/.agents/design/apps/catalog/dist/storybook/assets/formatter-L2YTDE3Q-D0OSgxWz.js +1 -0
  219. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{iframe-9yZfIsdT.js → iframe-DcXBsFPz.js} +3 -3
  220. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{react-18-BoCSnq6H.js → react-18-CRM89QRf.js} +1 -1
  221. package/templates/.agents/design/apps/catalog/dist/storybook/assets/react-C3tkVMIp.js +1 -0
  222. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{syntaxhighlighter-YFXUGROL-Bnn_nMwJ.js → syntaxhighlighter-YFXUGROL-B03jQGTF.js} +1 -1
  223. package/templates/.agents/design/apps/catalog/dist/storybook/assets/{theming-DS_ue2sb.js → theming-4ZyufAga.js} +1 -1
  224. package/templates/.agents/design/apps/catalog/dist/storybook/iframe.html +1 -1
  225. package/templates/.agents/design/apps/catalog/dist/storybook/index.json +1 -1
  226. package/templates/.agents/design/apps/catalog/package.json +2 -2
  227. package/templates/.agents/design/apps/catalog/src/components/AutonomySpecimen.tsx +15 -0
  228. package/templates/.agents/design/apps/catalog/src/components/CostPopulationSpecimen.test.tsx +19 -0
  229. package/templates/.agents/design/apps/catalog/src/components/CostPopulationSpecimen.tsx +45 -0
  230. package/templates/.agents/design/apps/catalog/src/components/EstimatedCostSpecimen.tsx +48 -0
  231. package/templates/.agents/design/apps/catalog/src/components/ProjectStatusSpecimen.tsx +169 -0
  232. package/templates/.agents/design/apps/catalog/src/pages/ComponentsPage.tsx +55 -0
  233. package/templates/.agents/design/apps/catalog/src/stories/Components.stories.tsx +60 -0
  234. package/templates/.agents/design/packages/local-runtime/package.json +1 -1
  235. package/templates/.agents/requirements/autonomous-assurance.md +1 -1
  236. package/templates/.agents/requirements/cloud-hostinger-autonomy.md +1 -1
  237. package/templates/.agents/requirements/comparative-audit.md +1 -1
  238. package/templates/.agents/requirements/context-engine.md +1 -1
  239. package/templates/.agents/requirements/cost-observability.md +1 -1
  240. package/templates/.agents/requirements/dashboard-launch.md +1 -1
  241. package/templates/.agents/requirements/data-export.md +1 -1
  242. package/templates/.agents/requirements/design-system.md +1 -1
  243. package/templates/.agents/requirements/execution-engine.md +1 -1
  244. package/templates/.agents/requirements/kanban-dashboard.md +1 -1
  245. package/templates/.agents/requirements/model-orchestration.md +1 -1
  246. package/templates/.agents/requirements/public-distribution.md +1 -1
  247. package/templates/.agents/requirements/software-architecture.md +1 -1
  248. package/templates/.agents/requirements/strategic-improvements.md +1 -1
  249. package/templates/.agents/requirements/work-lifecycle.md +5 -5
  250. package/templates/.agents/requirements/zaip-strategic-95.md +1 -1
  251. package/templates/.agents/rules/astra-diagnostic.md +3 -1
  252. package/templates/.agents/rules/autonomy-decision.md +10 -2
  253. package/templates/.agents/rules/core.md +12 -1
  254. package/templates/.agents/rules/run-lifecycle-closure.md +8 -6
  255. package/templates/.agents/rules/workflow.md +2 -2
  256. package/templates/.agents/runtime/VERSION +1 -1
  257. package/templates/.agents/runtime/bin/zaip.mjs +383 -350
  258. package/templates/.agents/runtime/checksums.sha256 +6 -6
  259. package/templates/.agents/runtime/manifest.json +1 -1
  260. package/templates/.agents/runtime/pnpm-lock.sha256 +1 -1
  261. package/templates/.agents/runtime/provenance.json +5 -5
  262. package/templates/.agents/runtime/sbom.cdx.json +3 -3
  263. package/templates/.agents/skills/zaip-skill-dev-environment/SKILL.md +2 -0
  264. package/templates/.agents/skills/zaip-skill-execution/SKILL.md +28 -5
  265. package/templates/.agents/skills/zaip-skill-execution/references/runtime-governance.md +17 -3
  266. package/templates/.agents/skills/zaip-skill-github-deploy/SKILL.md +8 -9
  267. package/templates/.agents/skills/zaip-skill-github-deploy/references/deployment-workflow.md +10 -6
  268. package/templates/.agents/skills/zaip-skill-github-deploy/references/release-identity.md +17 -12
  269. package/templates/.agents/skills/zaip-skill-move-prd/SKILL.md +2 -0
  270. package/templates/.agents/skills/zaip-skill-prd/SKILL.md +2 -0
  271. package/templates/.agents/skills/zaip-skill-release-qualification/SKILL.md +21 -23
  272. package/templates/.agents/skills/zaip-skill-release-qualification/references/local-preparation.md +37 -13
  273. package/templates/.agents/skills/zaip-skill-setup/SKILL.md +2 -0
  274. package/templates/.agents/skills/zaip-skill-tool-setup/SKILL.md +2 -0
  275. package/templates/.agents/zaip-aios/INDEX.md +9 -1
  276. package/templates/.agents/zaip-aios/README.md +24 -2
  277. package/templates/.agents/zaip-aios/VERSION +1 -1
  278. package/templates/.agents/zaip-aios/guides/01-primeiros-passos.md +5 -1
  279. package/templates/.agents/zaip-aios/guides/03-tasks.md +15 -2
  280. package/templates/.agents/zaip-aios/guides/04-specs.md +13 -0
  281. package/templates/.agents/zaip-aios/guides/05-prds.md +13 -0
  282. package/templates/.agents/zaip-aios/guides/06-execucao.md +19 -4
  283. package/templates/.agents/zaip-aios/guides/07-revisao-e-validacao.md +14 -0
  284. package/templates/.agents/zaip-aios/guides/08-contexto-e-tokens.md +4 -3
  285. package/templates/.agents/zaip-aios/guides/09-agentes-e-squads.md +17 -9
  286. package/templates/.agents/zaip-aios/guides/10-seguranca.md +9 -0
  287. package/templates/.agents/zaip-aios/guides/11-observabilidade-e-custos.md +69 -0
  288. package/templates/.agents/zaip-aios/guides/12-instalacao-e-upgrade.md +9 -4
  289. package/templates/.agents/zaip-aios/guides/13-boas-praticas.md +7 -1
  290. package/templates/.agents/zaip-aios/guides/14-troubleshooting.md +18 -0
  291. package/templates/.agents/zaip-aios/guides/16-lifecycle-e-reconciliacao.md +54 -3
  292. package/templates/.agents/zaip-aios/guides/18-catalogo-de-agentes.md +10 -2
  293. package/templates/.agents/zaip-aios/guides/19-assurance-e-autonomia.md +186 -5
  294. package/templates/.agents/zaip-aios/guides/20-instalacao-detalhada.md +21 -15
  295. package/templates/.agents/zaip-aios/guides/21-telemetria-monitor-custos.md +18 -2
  296. package/templates/.agents/zaip-aios/guides/22-fluxos-e-roteamento.md +14 -2
  297. package/templates/.agents/zaip-aios/guides/23-orquestracao-de-modelos.md +190 -489
  298. package/templates/.agents/zaip-aios/guides/26-qualidade-e-release.md +72 -13
  299. package/templates/.agents/zaip-aios/guides/27-telemetria-git-native.md +18 -0
  300. package/templates/.agents/zaip-aios/guides/28-lifecycle-completo.md +18 -1
  301. package/templates/template-manifest.json +454 -274
  302. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-1L7Qw-Gq.js +0 -3
  303. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-EInWr641.css +0 -1
  304. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-B6aZfo5f.js +0 -68
  305. package/templates/.agents/dashboard/apps/frontend/dist/assets/dashboard-localization-CLJ0lT9v.js +0 -231
  306. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DgTmNHN5.js +0 -2
  307. package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-DQpKX9c1.js +0 -1
  308. package/templates/.agents/design/apps/catalog/dist/storybook/assets/CatalogShell-BWY-80s4.js +0 -1
  309. package/templates/.agents/design/apps/catalog/dist/storybook/assets/Components.stories-Be2mDUQj.js +0 -27
  310. package/templates/.agents/design/apps/catalog/dist/storybook/assets/DesignSystem.stories-DRx9blDs.js +0 -1
  311. package/templates/.agents/design/apps/catalog/dist/storybook/assets/formatter-L2YTDE3Q-EwuTh8Zk.js +0 -1
  312. package/templates/.agents/design/apps/catalog/dist/storybook/assets/react-DyL61NPT.js +0 -1
@@ -7,13 +7,15 @@ const baseURL = process.env.PLAYWRIGHT_BASE_URL ?? `http://127.0.0.1:${serverPor
7
7
 
8
8
  export default defineConfig({
9
9
  testDir: "./specs",
10
+ globalSetup: "./lease-global-setup.ts",
10
11
  fullyParallel: false,
11
12
  timeout: 180_000,
12
13
  expect: { timeout: 60_000 },
13
14
  retries: process.env.CI ? 1 : 0,
14
- // CI shares one SQLite runtime across the suite. Serializing browser workers
15
- // keeps the measured latency gates independent from runner CPU count.
16
- ...(process.env.CI ? { workers: 1 } : {}),
15
+ // Every suite invocation shares one SQLite runtime, including local release
16
+ // qualification. Concurrent browser workers turn latency/export checks into
17
+ // an unintended load test whose result depends on the host CPU count.
18
+ workers: 1,
17
19
  reporter: process.env.CI ? "github" : "list",
18
20
  use: {
19
21
  baseURL: `${baseURL}/?token=e2e-token`,
@@ -4,6 +4,18 @@ const COST_MONITOR_PATH = "/api/v2/cost-monitor";
4
4
  const STALE_SUMMARY_SENTINEL = "SENTINELA-RESPOSTA-ANTIGA";
5
5
  const fiveSeconds = 5_000;
6
6
 
7
+ test("reselecting the current bounded period never opens an unfinishable transition", async ({
8
+ page,
9
+ }) => {
10
+ await openDashboard(page);
11
+ await selectThisMonth(page);
12
+ await expect(periodControl(page)).toHaveValue("this-month");
13
+ await periodControl(page).selectOption("this-month");
14
+ await expect(page.locator(".period-transition-overlay")).toHaveCount(0, { timeout: fiveSeconds });
15
+ await expect(periodControl(page)).toHaveValue("this-month");
16
+ await expect(page.getByLabel("Kanban de trabalho")).toBeVisible();
17
+ });
18
+
7
19
  test("refreshes Cost Monitor within five seconds when Todo o Período is selected in place", async ({
8
20
  page,
9
21
  }) => {
@@ -86,12 +98,14 @@ test("does not let a late all-time summary overwrite the newer period", async ({
86
98
  });
87
99
  await page.addInitScript(() => {
88
100
  type Probe = {
101
+ armed: boolean;
89
102
  allTimeBody: string | null;
90
103
  allTimeFinished: boolean;
91
104
  allTimeStarted: boolean;
92
105
  releaseAllTime: null | (() => Promise<void>);
93
106
  };
94
107
  const probe: Probe = {
108
+ armed: false,
95
109
  allTimeBody: null,
96
110
  allTimeFinished: false,
97
111
  allTimeStarted: false,
@@ -109,7 +123,8 @@ test("does not let a late all-time summary overwrite the newer period", async ({
109
123
  url.searchParams.get("scope") === "summary" &&
110
124
  !url.searchParams.has("from") &&
111
125
  !url.searchParams.has("to");
112
- if (!isAllTimeSummary || probe.allTimeStarted) return originalFetch(input, init);
126
+ if (!probe.armed || !isAllTimeSummary || probe.allTimeStarted)
127
+ return originalFetch(input, init);
113
128
 
114
129
  probe.allTimeStarted = true;
115
130
  return new Promise<Response>((resolve, reject) => {
@@ -138,7 +153,12 @@ test("does not let a late all-time summary overwrite the newer period", async ({
138
153
  const staleBody = withStaleSummarySentinel(priorPeriodBody!);
139
154
  await page.evaluate((body) => {
140
155
  window.__costSummaryStaleProbe.allTimeBody = body;
156
+ // Arm only after the bounded snapshot is ready. The default first paint
157
+ // also requests All Time; intercepting it can satisfy the later wait early
158
+ // and race React's commit rather than the stale-response guard.
159
+ window.__costSummaryStaleProbe.armed = true;
141
160
  }, staleBody);
161
+ expect(await page.evaluate(() => window.__costSummaryStaleProbe.allTimeStarted)).toBe(false);
142
162
 
143
163
  await periodControl(page).selectOption("all");
144
164
  await expect
@@ -160,6 +180,7 @@ test("does not let a late all-time summary overwrite the newer period", async ({
160
180
  declare global {
161
181
  interface Window {
162
182
  __costSummaryStaleProbe: {
183
+ armed: boolean;
163
184
  allTimeBody: string | null;
164
185
  allTimeFinished: boolean;
165
186
  allTimeStarted: boolean;
@@ -72,7 +72,7 @@ test("measures Cost, Operation and Traceability surfaces without full snapshot h
72
72
  const apiActivityAt = new Map<string, number>();
73
73
  page.on("request", (request) => {
74
74
  if (!request.url().includes("/api/v2/")) return;
75
- if (isBackgroundReconciliation(request.url())) return;
75
+ if (isBackgroundReconciliation(request.url()) || isBrowserLease(request.url())) return;
76
76
  apiActivityAt.set(request.url(), performance.now());
77
77
  requestStartedAt.set(request, performance.now());
78
78
  apiRequestCount += 1;
@@ -81,7 +81,7 @@ test("measures Cost, Operation and Traceability surfaces without full snapshot h
81
81
  });
82
82
  const finishApiRequest = (request: { url(): string }) => {
83
83
  if (!request.url().includes("/api/v2/")) return;
84
- if (isBackgroundReconciliation(request.url())) return;
84
+ if (isBackgroundReconciliation(request.url()) || isBrowserLease(request.url())) return;
85
85
  apiActivityAt.set(request.url(), performance.now());
86
86
  const count = activeApiRequests.get(request.url()) ?? 0;
87
87
  if (count <= 1) activeApiRequests.delete(request.url());
@@ -501,15 +501,18 @@ async function waitForQuietApiRequests(
501
501
  .poll(
502
502
  () => {
503
503
  const latestActivityAt = getLatestActivityAt();
504
- return (
505
- getActiveApiRequests().length === 0 &&
506
- latestActivityAt !== null &&
507
- performance.now() - latestActivityAt >= 500
508
- );
504
+ return {
505
+ pending: getActiveApiRequests().map((url) => {
506
+ const parsed = new URL(url);
507
+ parsed.searchParams.delete("token");
508
+ return `${parsed.pathname}${parsed.search}`;
509
+ }),
510
+ settled: latestActivityAt !== null && performance.now() - latestActivityAt >= 500,
511
+ };
509
512
  },
510
513
  { timeout: 10_000 },
511
514
  )
512
- .toBe(true);
515
+ .toEqual({ pending: [], settled: true });
513
516
  }
514
517
 
515
518
  async function selectedPeriodQuery(page: Page, period: Metric["period"]): Promise<PeriodQuery> {
@@ -540,6 +543,12 @@ function isBackgroundReconciliation(url: string): boolean {
540
543
  return new URL(url).pathname === "/api/v2/reconcile-open-work";
541
544
  }
542
545
 
546
+ /** The browser's ownership stream intentionally stays open until page teardown.
547
+ * Its HTTP failures are still collected by the response listener above. */
548
+ function isBrowserLease(url: string): boolean {
549
+ return new URL(url).pathname === "/api/v2/browser-lease";
550
+ }
551
+
543
552
  async function assertCostPagination(
544
553
  page: Page,
545
554
  surface: Locator,
@@ -169,7 +169,11 @@ test("renders the modern read-only dashboard and meets accessibility gates", asy
169
169
  const initialUrl = new URL(initialResponse.url());
170
170
  expect(initialUrl.searchParams.has("from")).toBe(false);
171
171
  expect(initialUrl.searchParams.has("to")).toBe(false);
172
- await expect(page.getByRole("navigation", { name: "Dashboard Zaip AIOS menu" })).toBeVisible();
172
+ // Identity is loaded independently; both the initial title and the title
173
+ // with the observed repository identify the same accessible navigation.
174
+ await expect(
175
+ page.getByRole("navigation", { name: /^Dashboard Zaip AIOS(?: .+)? menu$/ }),
176
+ ).toBeVisible();
173
177
  const capabilityNav = page.getByRole("navigation", { name: "Áreas do dashboard" });
174
178
  const globalControls = page.locator(".dashboard-global-controls");
175
179
  await expect(capabilityNav).toBeVisible();
@@ -303,7 +307,8 @@ test("loads a quick Operations summary without full snapshot hydration", async (
303
307
  await expect(page.getByRole("heading", { name: "Status das PRDs" })).toBeVisible();
304
308
  await expect(page.getByRole("heading", { name: "Top 5 PRDs" })).toBeVisible();
305
309
  await expect(page.locator(".operations-run-bar").first()).toBeVisible();
306
- expect(operationsRequests.some((url) => url.includes("scope=detail"))).toBe(true);
310
+ // Quick already contains the macro counts, chart data and Top 5 asserted above.
311
+ expect(operationsRequests.some((url) => url.includes("scope=detail"))).toBe(false);
307
312
 
308
313
  await selectOperations(page);
309
314
  await expect(page.getByLabel("Kanban de trabalho")).toBeVisible();
@@ -418,7 +423,7 @@ test("embeds traceability and keeps global settings and help available", async (
418
423
  await page.getByRole("button", { name: "Fechar ajuda" }).click();
419
424
  });
420
425
 
421
- test("groups macro work in All and reveals descendant Tasks only in Tasks", async ({ page }) => {
426
+ test("filters the all-work board into Tasks, SPECs and PRDs after hydration", async ({ page }) => {
422
427
  await openDashboard(page);
423
428
  await selectPopulatedAllTime(page);
424
429
  await selectOperations(page);
@@ -427,15 +432,25 @@ test("groups macro work in All and reveals descendant Tasks only in Tasks", asyn
427
432
  const allItemCount = await boardItemCount(board);
428
433
 
429
434
  await page.getByRole("button", { exact: true, name: "Tarefas" }).click();
435
+ await expect(page.getByRole("button", { exact: true, name: "Tarefas" })).toHaveClass("is-active");
436
+ await expect(
437
+ board.locator(".operations-work-kind.is-spec, .operations-work-kind.is-prd"),
438
+ ).toHaveCount(0);
430
439
  const taskItemCount = await boardItemCount(board);
431
440
  expect(allItemCount).toBeGreaterThan(taskItemCount);
432
441
 
433
442
  await page.getByRole("button", { exact: true, name: "SPECs" }).click();
443
+ await expect(page.getByRole("button", { exact: true, name: "SPECs" })).toHaveClass("is-active");
444
+ await expect(
445
+ board.locator(".operations-work-kind.is-task, .operations-work-kind.is-prd"),
446
+ ).toHaveCount(0);
434
447
  const spec = page
435
448
  .locator(".operations-work-card")
436
449
  .filter({ has: page.locator(".operations-work-kind.is-spec") })
437
450
  .first();
438
- if ((await spec.count()) === 0) {
451
+ // The quick projection already supplies global totals; a temporarily empty
452
+ // paginated DOM does not mean the selected entity collection is empty.
453
+ if ((await boardItemCount(board)) === 0) {
439
454
  await expect(
440
455
  page.getByLabel("Kanban de trabalho").locator(".operations-task-card"),
441
456
  ).toHaveCount(0);
@@ -448,11 +463,15 @@ test("groups macro work in All and reveals descendant Tasks only in Tasks", asyn
448
463
  }
449
464
 
450
465
  await page.getByRole("button", { exact: true, name: "PRDs" }).click();
466
+ await expect(page.getByRole("button", { exact: true, name: "PRDs" })).toHaveClass("is-active");
467
+ await expect(
468
+ board.locator(".operations-work-kind.is-task, .operations-work-kind.is-spec"),
469
+ ).toHaveCount(0);
451
470
  const prd = page
452
471
  .locator(".operations-work-card")
453
472
  .filter({ has: page.locator(".operations-work-kind.is-prd") })
454
473
  .first();
455
- if ((await prd.count()) === 0) {
474
+ if ((await boardItemCount(board)) === 0) {
456
475
  await expect(
457
476
  page.getByLabel("Kanban de trabalho").locator(".operations-task-card"),
458
477
  ).toHaveCount(0);
@@ -540,6 +559,12 @@ test("shows the observed all-time macro duration consistently for SPEC and PRD",
540
559
  test("loads monthly overview quickly and keeps PRD and SPEC chart totals reconciled", async ({
541
560
  page,
542
561
  }) => {
562
+ const fullDetailRequests: string[] = [];
563
+ page.on("request", (request) => {
564
+ const url = new URL(request.url());
565
+ if (url.pathname === "/api/v2/operations" && url.searchParams.get("scope") === "detail")
566
+ fullDetailRequests.push(url.href);
567
+ });
543
568
  const openedAt = Date.now();
544
569
  const initialQuickResponse = await openDashboard(page);
545
570
  expect(Date.now() - openedAt).toBeLessThan(3_000);
@@ -601,6 +626,9 @@ test("loads monthly overview quickly and keeps PRD and SPEC chart totals reconci
601
626
  expect(donutCount).toBe(cardCount);
602
627
  expect(statusCounts.reduce((sum, value) => sum + Number(value), 0)).toBe(cardCount);
603
628
  expect(classificationCounts.reduce((sum, value) => sum + Number(value), 0)).toBe(cardCount);
629
+ // Macro metrics are already present in the exact quick response below.
630
+ // Clicking their cards must not start an unrelated full-history request.
631
+ expect(fullDetailRequests).toEqual([]);
604
632
 
605
633
  const macroKey = kind === "SPECs" ? "specs" : "prds";
606
634
  const macroDuration =
@@ -671,7 +699,20 @@ test("keeps aggregate KPIs visible without an obsolete coverage overlay", async
671
699
  await expect(page.locator(".operations-coverage-toast")).toHaveCount(0);
672
700
  await expect(page.getByRole("article", { name: /Tempo total de execu/ })).toBeVisible();
673
701
  await expect(page.getByRole("article", { name: /Tokens gastos/ })).toBeVisible();
674
- await expect(page.getByRole("article", { name: /Custo Estimado/ })).toBeVisible();
702
+ const cost = page.getByRole("article", {
703
+ name: /^Custo Estimado:/,
704
+ });
705
+ await expect(cost).toBeVisible();
706
+ await expect(cost.locator("small")).toContainText(/\/ tarefa .*\/ hora/);
707
+ await expect(cost).not.toContainText("Subtotal estimado conhecido");
708
+ if (await cost.getAttribute("aria-description")) {
709
+ await expect(cost).toHaveAttribute("aria-description", /runs com custo conhecido/);
710
+ await expect(cost.locator("small")).toHaveText(
711
+ /R\$\s*[\d.,]+ \/ tarefa \(R\$\s*[\d.,]+ \/ hora\)/,
712
+ );
713
+ await expect(cost).not.toContainText("ⓘ");
714
+ await expect(cost).not.toContainText("indisponíveis por cobertura parcial");
715
+ }
675
716
  });
676
717
 
677
718
  async function openDashboard(page: import("@playwright/test").Page) {
@@ -0,0 +1,14 @@
1
+ import { expect, test } from "@playwright/test";
2
+
3
+ test("keeps the suite-owned runtime alive across closed browser pages", async ({
4
+ page,
5
+ request,
6
+ }) => {
7
+ await page.goto("/");
8
+ await page.close();
9
+ // Production launcher expiry is 12s: a replacement page must not race that deadline.
10
+ await new Promise((resolve) => setTimeout(resolve, 13_000));
11
+ const response = await request.get("/api/v2/health");
12
+ expect(response.status()).toBe(200);
13
+ expect(await response.json()).toMatchObject({ status: "ok" });
14
+ });
@@ -0,0 +1,200 @@
1
+ import { mkdir, writeFile } from "node:fs/promises";
2
+ import { dirname, join } from "node:path";
3
+
4
+ // Entirely synthetic acceptance fixtures, never real lifecycle evidence.
5
+ const at = "2026-01-01T02:30:00.000Z"; // 2025-12-31 in Sao Paulo.
6
+ export const cases = [
7
+ { suffix: "COMPLETE-A001", status: "completed", tokens: 15 },
8
+ { suffix: "FAILED-A002", status: "failed", tokens: null },
9
+ { suffix: "BLOCKED-A003", status: "blocked", tokens: 0 },
10
+ ].map((value) => ({
11
+ ...value,
12
+ task: `TASK-2026-01-01-00-00-${value.suffix}`,
13
+ change: `CHG-2026-01-01-00-00-${value.suffix}`,
14
+ run: `RUN-2026-01-01-00-00-${value.suffix}`,
15
+ }));
16
+
17
+ async function put(root, file, content) {
18
+ const target = join(root, file);
19
+ await mkdir(dirname(target), { recursive: true });
20
+ await writeFile(target, content, "utf8");
21
+ }
22
+ const markdown = (data) =>
23
+ `---\n${Object.entries(data)
24
+ .map(([key, value]) => `${key}: ${JSON.stringify(value)}`)
25
+ .join("\n")}\n---\n\n# Synthetic observability qualification fixture\n`;
26
+
27
+ export async function createObservabilityFixture(root) {
28
+ await put(
29
+ root,
30
+ ".agents/config/project.yaml",
31
+ "schema_version: 1\nzaip:\n enabled: true\nproject:\n id: synthetic-observability\n name: Synthetic observability\n timezone: America/Sao_Paulo\nstack:\n id: zaip-aios-stack\n overrides: {}\nclients:\n codex: true\n claude: true\ntracking:\n enabled: true\n currency: BRL\n storage_mode: tracked_sanitized\n",
32
+ );
33
+ await put(
34
+ root,
35
+ ".agents/config/framework.lock.yaml",
36
+ "lock_version: 1\nframework:\n version: 2.6.0\n distribution_sha256: null\nlayout:\n version: 3\nresolved_profile:\n id: null\n sha256: null\nmanaged_files: {}\n",
37
+ );
38
+ for (const item of cases) {
39
+ const task = {
40
+ schema_version: 2,
41
+ id: item.task,
42
+ revision: 1,
43
+ change_id: item.change,
44
+ title: `Synthetic ${item.status}`,
45
+ short_name: item.suffix,
46
+ objective: "Synthetic cross-layer regression",
47
+ status: item.status,
48
+ attempt_count: item.status === "completed" ? 2 : 1,
49
+ risk: "standard",
50
+ priority: "medium",
51
+ owner: null,
52
+ requirement_ids: ["REQ-SYNTHETIC-001"],
53
+ acceptance_ids: ["AC-SYNTHETIC-001"],
54
+ depends_on: [],
55
+ write_scopes: ["synthetic/**"],
56
+ plan_revision: 1,
57
+ plan_hash: "a".repeat(64),
58
+ created_at: at,
59
+ updated_at: at,
60
+ started_at: at,
61
+ finished_at: item.status === "blocked" ? null : at,
62
+ result:
63
+ item.status === "blocked"
64
+ ? null
65
+ : {
66
+ summary: "Synthetic terminal fixture, not real approval",
67
+ changed_files: [],
68
+ evidence_ids: ["EVD-SYNTHETIC-FIXTURE"],
69
+ completed_run_id: item.run,
70
+ },
71
+ };
72
+ const change = {
73
+ schema_version: 2,
74
+ id: item.change,
75
+ revision: 1,
76
+ title: task.title,
77
+ status: item.status,
78
+ risk: "standard",
79
+ source: { type: "task", task_id: item.task },
80
+ requirement_ids: task.requirement_ids,
81
+ acceptance_ids: task.acceptance_ids,
82
+ requirement_impact: { type: "none", reason: "Synthetic fixture" },
83
+ task_ids: [item.task],
84
+ plan_revision: 1,
85
+ plan_hash: task.plan_hash,
86
+ created_at: at,
87
+ updated_at: at,
88
+ started_at: at,
89
+ finished_at: task.finished_at,
90
+ result: item.status === "blocked" ? null : "Synthetic fixture",
91
+ };
92
+ await put(root, `.agents/records/tasks/2026/01/${item.task}.md`, markdown(task));
93
+ await put(root, `.agents/records/changes/2026/01/${item.change}/change.md`, markdown(change));
94
+ const common = { schema_version: 2, run_id: item.run, occurred_at: at, phase: "execution" };
95
+ const records = [
96
+ {
97
+ ...common,
98
+ event_id: `${item.run}:1`,
99
+ sequence: 1,
100
+ type: "run.started",
101
+ attribution_status: "attributed",
102
+ run_role: "orchestrator",
103
+ run_purpose: "execution",
104
+ requires_finalizer: false,
105
+ execution_kind: "delivery",
106
+ execution_eligibility: ["delivery"],
107
+ entrypoint: "task",
108
+ work_type: item.status === "completed" ? "rework" : "new",
109
+ storage_mode: "tracked_sanitized",
110
+ client: "codex",
111
+ agent: "synthetic-agent",
112
+ agent_name: "synthetic-agent",
113
+ provider: "openai",
114
+ model: "synthetic-model",
115
+ reasoning_effort: null,
116
+ client_thread_id: `synthetic-${item.suffix}`,
117
+ client_turn_id: `synthetic-turn-${item.suffix}`,
118
+ conversation_id: `CONV-SYNTHETIC-${item.suffix}`,
119
+ execution_id: `EXEC-SYNTHETIC-${item.suffix}`,
120
+ task_id: item.task,
121
+ spec_id: null,
122
+ prd_id: null,
123
+ change_id: item.change,
124
+ parent_run_id: null,
125
+ continuation_of_run_id: null,
126
+ retry_of_run_id: item.status === "completed" ? `${item.run}-PRIOR` : null,
127
+ },
128
+ ];
129
+ if (item.tokens !== null)
130
+ records.push({
131
+ ...common,
132
+ event_id: `${item.run}:2`,
133
+ sequence: 2,
134
+ type: "usage.recorded",
135
+ activity_kind: "model_usage",
136
+ classification_source: "explicit",
137
+ tokens: {
138
+ input: item.tokens,
139
+ cached_input: 0,
140
+ output: 0,
141
+ reasoning: 0,
142
+ total: item.tokens,
143
+ source: "provider_reported",
144
+ },
145
+ cost: { usd: null, brl: null, fx_rate: null },
146
+ provider: "openai",
147
+ model: "synthetic-model",
148
+ source_segment_key: `synthetic-${item.suffix}`,
149
+ supersedes_event_id: null,
150
+ });
151
+ records.push({
152
+ ...common,
153
+ event_id: `${item.run}:${records.length + 1}`,
154
+ sequence: records.length + 1,
155
+ type: "run.finished",
156
+ status: item.status === "failed" ? "failed" : "completed",
157
+ duration_ms: null,
158
+ duration_provenance: null,
159
+ });
160
+ await put(
161
+ root,
162
+ `.agents/records/runs/2026/01/${item.run}.jsonl`,
163
+ `${records.map((record) => JSON.stringify(record)).join("\n")}\n`,
164
+ );
165
+ if (item.status === "completed") {
166
+ for (const kind of ["PRIOR", "FINALIZER"]) {
167
+ const runId = `${item.run}-${kind}`;
168
+ const extra = records.map((record, index) => ({
169
+ ...record,
170
+ run_id: runId,
171
+ event_id: `${runId}:${index + 1}`,
172
+ }));
173
+ Object.assign(extra[0], {
174
+ run_role: kind === "FINALIZER" ? "subagent" : "orchestrator",
175
+ run_purpose: kind === "FINALIZER" ? "finalization" : "execution",
176
+ agent: kind === "FINALIZER" ? "zaip-agent-finalizer" : "synthetic-agent",
177
+ agent_name: kind === "FINALIZER" ? "zaip-agent-finalizer" : "synthetic-agent",
178
+ parent_run_id: kind === "FINALIZER" ? item.run : null,
179
+ retry_of_run_id: null,
180
+ client_turn_id: `synthetic-turn-${kind}`,
181
+ });
182
+ extra[1].tokens = {
183
+ input: 0,
184
+ cached_input: 0,
185
+ output: 0,
186
+ reasoning: 0,
187
+ total: 0,
188
+ source: "provider_reported",
189
+ };
190
+ extra.at(-1).status = kind === "PRIOR" ? "failed" : "completed";
191
+ await put(
192
+ root,
193
+ `.agents/records/runs/2026/01/${runId}.jsonl`,
194
+ `${extra.map((record) => JSON.stringify(record)).join("\n")}\n`,
195
+ );
196
+ }
197
+ }
198
+ }
199
+ return cases;
200
+ }