@zaip-ai/cli 1.0.7 → 1.3.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 (444) hide show
  1. package/README.md +6 -4
  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 +15 -5
  5. package/dist/services/adapters.js.map +1 -1
  6. package/dist/services/adapters.test.js +1 -1
  7. package/dist/services/agent-adapters.d.ts +9 -0
  8. package/dist/services/agent-adapters.d.ts.map +1 -1
  9. package/dist/services/agent-adapters.js +39 -4
  10. package/dist/services/agent-adapters.js.map +1 -1
  11. package/dist/services/agent-adapters.test.js +13 -1
  12. package/dist/services/agent-adapters.test.js.map +1 -1
  13. package/dist/services/codex-config-template.d.ts +2 -1
  14. package/dist/services/codex-config-template.d.ts.map +1 -1
  15. package/dist/services/codex-config-template.js +13 -2
  16. package/dist/services/codex-config-template.js.map +1 -1
  17. package/dist/services/codex-rules.d.ts +1 -1
  18. package/dist/services/codex-rules.d.ts.map +1 -1
  19. package/dist/services/codex-rules.js +31 -7
  20. package/dist/services/codex-rules.js.map +1 -1
  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 +4 -1
  24. package/dist/services/codex-subagent-hook-template.js.map +1 -1
  25. package/dist/services/doctor.d.ts.map +1 -1
  26. package/dist/services/doctor.js +3 -1
  27. package/dist/services/doctor.js.map +1 -1
  28. package/dist/services/global-codex-config.d.ts +6 -3
  29. package/dist/services/global-codex-config.d.ts.map +1 -1
  30. package/dist/services/global-codex-config.js +82 -13
  31. package/dist/services/global-codex-config.js.map +1 -1
  32. package/dist/services/global-codex-config.test.js +57 -10
  33. package/dist/services/global-codex-config.test.js.map +1 -1
  34. package/dist/services/install-agents-template.d.ts.map +1 -1
  35. package/dist/services/install-agents-template.js +15 -2
  36. package/dist/services/install-agents-template.js.map +1 -1
  37. package/dist/services/logger.js +1 -1
  38. package/dist/services/logger.js.map +1 -1
  39. package/dist/services/logger.test.js +3 -3
  40. package/dist/services/logger.test.js.map +1 -1
  41. package/dist/services/runtime-template.test.js +21 -5
  42. package/dist/services/runtime-template.test.js.map +1 -1
  43. package/dist/services/template-manifest.d.ts.map +1 -1
  44. package/dist/services/template-manifest.js +7 -0
  45. package/dist/services/template-manifest.js.map +1 -1
  46. package/package.json +1 -1
  47. package/templates/.agents/architecture/software-architecture.md +131 -0
  48. package/templates/.agents/branding/brandbook.docx +0 -0
  49. package/templates/.agents/branding/brandbook.md +60 -0
  50. package/templates/.agents/config/agents/catalog.yaml +310 -10
  51. package/templates/.agents/config/clients/codex/agents/zaip-agent-brand-strategist.toml +30 -0
  52. package/templates/.agents/config/clients/codex/agents/zaip-agent-designer.toml +5 -5
  53. package/templates/.agents/config/clients/codex/agents/zaip-agent-finalizer.toml +2 -2
  54. package/templates/.agents/config/clients/codex/agents/zaip-agent-general-operations.toml +30 -0
  55. package/templates/.agents/config/clients/codex/agents/zaip-agent-governance-compliance.toml +30 -0
  56. package/templates/.agents/config/clients/codex/agents/zaip-agent-growth-strategist.toml +30 -0
  57. package/templates/.agents/config/clients/codex/agents/zaip-agent-marketing-analyst.toml +8 -8
  58. package/templates/.agents/config/clients/codex/agents/zaip-agent-orchestrator.toml +5 -3
  59. package/templates/.agents/config/clients/codex/agents/zaip-agent-sales-specialist.toml +30 -0
  60. package/templates/.agents/config/project.yaml +1 -1
  61. package/templates/.agents/dashboard/.tmp-run-list.json +254 -0
  62. package/templates/.agents/dashboard/.zaip-managed.json +775 -163
  63. package/templates/.agents/dashboard/DATA-DICTIONARY.md +2227 -0
  64. package/templates/.agents/dashboard/README.md +48 -97
  65. package/templates/.agents/dashboard/apps/frontend/dist/assets/CostCalculationGuidePage-DxR_pgSV.js +1 -0
  66. package/templates/.agents/dashboard/apps/frontend/dist/assets/DashboardHelpDialog-4jZLTWE_.js +2156 -0
  67. package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-CKcsqb-r.js +1 -0
  68. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-BomxqCBU.css +1 -0
  69. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-DmmJD2Th.js +3 -0
  70. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-BwtitWa_.js +1 -0
  71. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-CaKwQP43.css +1 -0
  72. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-BZ5WdaMN.css +1 -0
  73. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-N5Csr0RP.js +68 -0
  74. package/templates/.agents/dashboard/apps/frontend/dist/assets/{dashboard-localization-C98LGC-Q.js → dashboard-localization-CLJ0lT9v.js} +1 -1
  75. package/templates/.agents/dashboard/apps/frontend/dist/assets/icons-vendor-C0fj2uU9.js +1 -0
  76. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-C4aIB1PV.js +2 -0
  77. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DK_enB5Z.css +1 -0
  78. package/templates/.agents/dashboard/apps/frontend/dist/assets/react-vendor-BEsJ-FYH.js +9 -0
  79. package/templates/.agents/dashboard/apps/frontend/dist/assets/rolldown-runtime-D9-fqq9M.js +1 -0
  80. package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-B6y6Gw12.js +1 -0
  81. package/templates/.agents/dashboard/apps/frontend/dist/assets/traceability-DFY7ZDlu.css +1 -0
  82. package/templates/.agents/dashboard/apps/frontend/dist/index.html +9 -2
  83. package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
  84. package/templates/.agents/dashboard/apps/frontend/src/App.tsx +1129 -600
  85. package/templates/.agents/dashboard/apps/frontend/src/AppLoadingBoundary.tsx +48 -0
  86. package/templates/.agents/dashboard/apps/frontend/src/AppLoadingPanels.tsx +2 -0
  87. package/templates/.agents/dashboard/apps/frontend/src/AppOverlays.tsx +247 -0
  88. package/templates/.agents/dashboard/apps/frontend/src/AppRequestGuards.tsx +95 -0
  89. package/templates/.agents/dashboard/apps/frontend/src/AppSetupRoutes.tsx +87 -0
  90. package/templates/.agents/dashboard/apps/frontend/src/CostCalculationGuidePage.tsx +641 -0
  91. package/templates/.agents/dashboard/apps/frontend/src/DashboardAlternateContent.tsx +159 -0
  92. package/templates/.agents/dashboard/apps/frontend/src/DashboardCapabilityNav.tsx +13 -13
  93. package/templates/.agents/dashboard/apps/frontend/src/DashboardGlobalSettings.tsx +56 -0
  94. package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.tsx +266 -315
  95. package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +151 -0
  96. package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.test.ts +37 -0
  97. package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.tsx +114 -12
  98. package/templates/.agents/dashboard/apps/frontend/src/app-preferences.ts +15 -0
  99. package/templates/.agents/dashboard/apps/frontend/src/app-session-token.ts +20 -0
  100. package/templates/.agents/dashboard/apps/frontend/src/cost-calculation-guide.css +267 -0
  101. package/templates/.agents/dashboard/apps/frontend/src/cost-calculation-guide.test.ts +69 -0
  102. package/templates/.agents/dashboard/apps/frontend/src/cost-period-refresh.test.ts +85 -0
  103. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.test.ts +133 -0
  104. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +453 -13
  105. package/templates/.agents/dashboard/apps/frontend/src/dashboard-localization.ts +1 -1
  106. package/templates/.agents/dashboard/apps/frontend/src/main.tsx +1 -0
  107. package/templates/.agents/dashboard/apps/frontend/src/operations-detail-hydration.test.ts +55 -0
  108. package/templates/.agents/dashboard/apps/frontend/src/operations-detail-hydration.ts +36 -0
  109. package/templates/.agents/dashboard/apps/frontend/src/operations-entity-page-projection.test.ts +126 -0
  110. package/templates/.agents/dashboard/apps/frontend/src/operations-entity-page-projection.ts +181 -0
  111. package/templates/.agents/dashboard/apps/frontend/src/operations-period-contract.test.ts +138 -0
  112. package/templates/.agents/dashboard/apps/frontend/src/operations-period-render.test.ts +105 -0
  113. package/templates/.agents/dashboard/apps/frontend/src/operations-period.test.ts +6 -3
  114. package/templates/.agents/dashboard/apps/frontend/src/operations-period.ts +9 -5
  115. package/templates/.agents/dashboard/apps/frontend/src/overview-status-page.test.ts +26 -0
  116. package/templates/.agents/dashboard/apps/frontend/src/period-transition-overlay.css +44 -0
  117. package/templates/.agents/dashboard/apps/frontend/src/project-settings-model.ts +121 -62
  118. package/templates/.agents/dashboard/apps/frontend/src/project-settings-page.css +482 -3
  119. package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +84 -17
  120. package/templates/.agents/dashboard/apps/frontend/src/snapshot-banner-semantics.test.ts +78 -0
  121. package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +234 -39
  122. package/templates/.agents/dashboard/apps/frontend/src/snapshot-notice.ts +15 -0
  123. package/templates/.agents/dashboard/apps/frontend/src/sqlite-cost-adapters.ts +26 -0
  124. package/templates/.agents/dashboard/apps/frontend/src/styles.css +14 -2
  125. package/templates/.agents/dashboard/apps/frontend/src/traceability-workspace.css +38 -2
  126. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.test.ts +253 -0
  127. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.ts +380 -0
  128. package/templates/.agents/dashboard/apps/frontend/src/use-app-effects.ts +175 -0
  129. package/templates/.agents/dashboard/apps/frontend/src/use-app-operations-pages.ts +395 -0
  130. package/templates/.agents/dashboard/apps/frontend/src/use-app-trace-documents.ts +141 -0
  131. package/templates/.agents/dashboard/apps/frontend/src/use-idle-cost-prefetch.ts +45 -0
  132. package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.test.ts +46 -0
  133. package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.ts +36 -0
  134. package/templates/.agents/dashboard/apps/frontend/vite.config.ts +58 -5
  135. package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
  136. package/templates/.agents/dashboard/modules/cost-monitor/src/contracts.ts +47 -6
  137. package/templates/.agents/dashboard/modules/cost-monitor/src/duration-estimate.ts +13 -0
  138. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.test.ts +134 -0
  139. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.tsx +290 -0
  140. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.test.ts +133 -19
  141. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.tsx +134 -43
  142. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostFilters.tsx +137 -19
  143. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostModelsAuditTable.test.ts +2 -0
  144. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostModelsAuditTable.tsx +13 -10
  145. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorContent.tsx +328 -0
  146. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.test.ts +302 -6
  147. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +627 -400
  148. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostSummary.tsx +5 -13
  149. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.test.ts +370 -72
  150. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.tsx +467 -326
  151. package/templates/.agents/dashboard/modules/cost-monitor/src/react/MacroCostTable.test.ts +17 -0
  152. package/templates/.agents/dashboard/modules/cost-monitor/src/react/MacroCostTable.tsx +25 -6
  153. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-copy.ts +0 -2
  154. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-page-helpers.ts +17 -0
  155. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-responsive.css +6 -3
  156. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-row-filters.ts +123 -0
  157. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-summary.ts +8 -3
  158. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-views.ts +32 -0
  159. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor.css +55 -14
  160. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-table-presentation.ts +121 -0
  161. package/templates/.agents/dashboard/modules/cost-monitor/src/react/index.ts +3 -0
  162. package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.test.ts +68 -0
  163. package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.ts +33 -5
  164. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-compact-cost-page.ts +119 -0
  165. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.test.ts +12 -0
  166. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.ts +146 -0
  167. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-run-page.ts +118 -0
  168. package/templates/.agents/dashboard/modules/cost-monitor/src/server/aggregate.test.ts +2 -2
  169. package/templates/.agents/dashboard/modules/cost-monitor/src/server/aggregate.ts +5 -3
  170. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-pricing-fallback.test.ts +53 -0
  171. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.basics.test.ts +34 -0
  172. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.test.ts +168 -161
  173. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.ts +188 -29
  174. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.test.ts +757 -0
  175. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.ts +784 -0
  176. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-terminal-day.test.ts +100 -0
  177. package/templates/.agents/dashboard/modules/cost-monitor/src/server/index.ts +1 -0
  178. package/templates/.agents/dashboard/modules/cost-monitor/src/server/refactor-map-xr9l.json +61 -0
  179. package/templates/.agents/dashboard/modules/cost-monitor/src/server/source-size-cost-server/build-cost-monitor-projection-agents.test.ts +31 -0
  180. package/templates/.agents/dashboard/modules/cost-monitor/src/server/source-size-cost-server/build-cost-summary-projection-duration.test.ts +414 -0
  181. package/templates/.agents/dashboard/modules/cost-monitor/src/task-cost-groups.test.ts +41 -0
  182. package/templates/.agents/dashboard/modules/cost-monitor/src/task-cost-groups.ts +55 -11
  183. package/templates/.agents/dashboard/modules/operations/package.json +2 -1
  184. package/templates/.agents/dashboard/modules/operations/src/contracts.ts +185 -0
  185. package/templates/.agents/dashboard/modules/operations/src/duration-population.test.ts +63 -1
  186. package/templates/.agents/dashboard/modules/operations/src/duration-population.ts +60 -5
  187. package/templates/.agents/dashboard/modules/operations/src/react/EntityDetailsDialog.tsx +14 -3
  188. package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.test.ts +44 -1
  189. package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.tsx +345 -18
  190. package/templates/.agents/dashboard/modules/operations/src/react/MacroPlanningDialog.tsx +1 -0
  191. package/templates/.agents/dashboard/modules/operations/src/react/OperationDateFilters.test.ts +9 -5
  192. package/templates/.agents/dashboard/modules/operations/src/react/OperationDateFilters.tsx +2 -2
  193. package/templates/.agents/dashboard/modules/operations/src/react/OperationsMainContent.tsx +168 -0
  194. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.helpers.tsx +95 -6
  195. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.test.ts +367 -14
  196. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.tsx +562 -131
  197. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +353 -355
  198. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageNavigation.tsx +65 -0
  199. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageOverview.tsx +169 -0
  200. package/templates/.agents/dashboard/modules/operations/src/react/PeriodSummaryTable.tsx +73 -8
  201. package/templates/.agents/dashboard/modules/operations/src/react/PrdDocumentDialog.test.tsx +32 -0
  202. package/templates/.agents/dashboard/modules/operations/src/react/PrdDocumentDialog.tsx +62 -6
  203. package/templates/.agents/dashboard/modules/operations/src/react/TaskBoard.test.ts +55 -0
  204. package/templates/.agents/dashboard/modules/operations/src/react/TaskBoard.tsx +27 -19
  205. package/templates/.agents/dashboard/modules/operations/src/react/TaskDetailsDialog.tsx +105 -42
  206. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkBoard.priority.test.ts +19 -0
  207. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkBoard.tsx +265 -36
  208. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.test.ts +171 -8
  209. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.tsx +98 -68
  210. package/templates/.agents/dashboard/modules/operations/src/react/conversation-rows.test.ts +72 -1
  211. package/templates/.agents/dashboard/modules/operations/src/react/conversation-rows.ts +78 -17
  212. package/templates/.agents/dashboard/modules/operations/src/react/execution-metrics.ts +6 -4
  213. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.test.ts +431 -1
  214. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.tsx +574 -20
  215. package/templates/.agents/dashboard/modules/operations/src/react/export/export-layout.test.ts +42 -4
  216. package/templates/.agents/dashboard/modules/operations/src/react/export/xlsx-runtime-e2e.test.ts +248 -0
  217. package/templates/.agents/dashboard/modules/operations/src/react/macro-planning-dialog-content.css +49 -0
  218. package/templates/.agents/dashboard/modules/operations/src/react/macro-planning-dialog.css +93 -50
  219. package/templates/.agents/dashboard/modules/operations/src/react/manual-work-priority.test.ts +82 -0
  220. package/templates/.agents/dashboard/modules/operations/src/react/operation-date-range.test.ts +29 -2
  221. package/templates/.agents/dashboard/modules/operations/src/react/operation-date-range.ts +22 -1
  222. package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.test.ts +77 -4
  223. package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.ts +67 -5
  224. package/templates/.agents/dashboard/modules/operations/src/react/operations-coverage-toast.test.ts +54 -0
  225. package/templates/.agents/dashboard/modules/operations/src/react/operations-global-filters.test.ts +22 -0
  226. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview-period-filter.test.ts +149 -12
  227. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview.status-cards.test.ts +27 -0
  228. package/templates/.agents/dashboard/modules/operations/src/react/operations-page-contract.ts +176 -0
  229. package/templates/.agents/dashboard/modules/operations/src/react/operations-period-scope.test.ts +160 -0
  230. package/templates/.agents/dashboard/modules/operations/src/react/operations-period-scope.ts +47 -0
  231. package/templates/.agents/dashboard/modules/operations/src/react/operations-query.ts +10 -0
  232. package/templates/.agents/dashboard/modules/operations/src/react/operations-responsive.css +3 -0
  233. package/templates/.agents/dashboard/modules/operations/src/react/operations-view-labels.ts +28 -0
  234. package/templates/.agents/dashboard/modules/operations/src/react/operations-view-order.test.ts +21 -7
  235. package/templates/.agents/dashboard/modules/operations/src/react/operations.css +42 -0
  236. package/templates/.agents/dashboard/modules/operations/src/react/period-summary-population.test.ts +54 -0
  237. package/templates/.agents/dashboard/modules/operations/src/react/period-summary-population.ts +32 -0
  238. package/templates/.agents/dashboard/modules/operations/src/react/period-summary.test.ts +241 -6
  239. package/templates/.agents/dashboard/modules/operations/src/react/period-summary.ts +148 -6
  240. package/templates/.agents/dashboard/modules/operations/src/react/popup-localization.test.ts +1 -1
  241. package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.css +132 -0
  242. package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.css.test.ts +13 -0
  243. package/templates/.agents/dashboard/modules/operations/src/react/unified-work-board.header.test.ts +16 -0
  244. package/templates/.agents/dashboard/modules/operations/src/react/use-infinite-column.ts +11 -5
  245. package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.test.ts +7 -4
  246. package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.ts +5 -84
  247. package/templates/.agents/dashboard/modules/operations/src/server/build-operations-projection.test.ts +291 -15
  248. package/templates/.agents/dashboard/modules/operations/src/server/build-operations-projection.ts +182 -472
  249. package/templates/.agents/dashboard/modules/operations/src/server/canonical-compat.test.ts +40 -0
  250. package/templates/.agents/dashboard/modules/operations/src/server/canonical-compat.ts +19 -6
  251. package/templates/.agents/dashboard/modules/operations/src/server/canonical-run-projection.ts +31 -6
  252. package/templates/.agents/dashboard/modules/operations/src/server/daily-duration-projection.ts +220 -0
  253. package/templates/.agents/dashboard/modules/operations/src/server/execution-duration-projection.ts +28 -0
  254. package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.test.ts +39 -2
  255. package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.ts +25 -13
  256. package/templates/.agents/dashboard/modules/operations/src/server/filter.test.ts +3 -3
  257. package/templates/.agents/dashboard/modules/operations/src/server/filter.ts +7 -2
  258. package/templates/.agents/dashboard/modules/operations/src/server/index.ts +3 -0
  259. package/templates/.agents/dashboard/modules/operations/src/server/macro.ts +3 -12
  260. package/templates/.agents/dashboard/modules/operations/src/server/manifest-usage.ts +65 -0
  261. package/templates/.agents/dashboard/modules/operations/src/server/operations-projection-aggregates.ts +297 -0
  262. package/templates/.agents/dashboard/modules/operations/src/server/quick-daily-operations-projection.ts +330 -0
  263. package/templates/.agents/dashboard/modules/operations/src/server/quick-operations-projection.test.ts +505 -0
  264. package/templates/.agents/dashboard/modules/operations/src/server/quick-operations-projection.ts +609 -0
  265. package/templates/.agents/dashboard/modules/operations/src/server/runs.ts +18 -19
  266. package/templates/.agents/dashboard/modules/operations/src/work-board-model.ts +76 -0
  267. package/templates/.agents/dashboard/modules/traceability/package.json +1 -1
  268. package/templates/.agents/dashboard/modules/traceability/src/server/build-task-trace.ts +3 -1
  269. package/templates/.agents/dashboard/packages/branding/package.json +1 -1
  270. package/templates/.agents/dashboard/packages/branding/src/index.ts +1 -1
  271. package/templates/.agents/dashboard/packages/contracts/package.json +1 -1
  272. package/templates/.agents/dashboard/packages/contracts/src/index.ts +2 -0
  273. package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
  274. package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +1759 -0
  275. package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs.metafile.json +7333 -0
  276. package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +1611 -0
  277. package/templates/.agents/dashboard/packages/local-runtime/package.json +8 -3
  278. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-dashboard.mjs +20 -0
  279. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs +114 -0
  280. package/templates/.agents/dashboard/packages/local-runtime/scripts/rebuild-sqlite-read-model.mjs +31 -0
  281. package/templates/.agents/dashboard/packages/local-runtime/scripts/source-size-runtime-scripts/sqlite-read-model-fixture.mjs +397 -0
  282. package/templates/.agents/dashboard/packages/local-runtime/scripts/test-sqlite-read-model.mjs +589 -0
  283. package/templates/.agents/dashboard/packages/local-runtime/scripts/test-unix-launchers.mjs +53 -0
  284. package/templates/.agents/dashboard/packages/local-runtime/scripts/validate-sqlite-read-model.mjs +203 -0
  285. package/templates/.agents/dashboard/packages/local-runtime/server.mjs +1646 -107
  286. package/templates/.agents/dashboard/packages/local-runtime/src/agent-adapter-sync.ts +30 -0
  287. package/templates/.agents/dashboard/packages/local-runtime/src/agent-catalog-settings.test.ts +3 -2
  288. package/templates/.agents/dashboard/packages/local-runtime/src/agent-catalog-settings.ts +5 -0
  289. package/templates/.agents/dashboard/packages/local-runtime/src/manifest-runs.ts +72 -33
  290. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +339 -4
  291. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +392 -1
  292. package/templates/.agents/dashboard/packages/local-runtime/src/runtime.mjs +5 -5
  293. package/templates/.agents/dashboard/packages/local-runtime/src/server-board.test.ts +110 -0
  294. package/templates/.agents/dashboard/packages/local-runtime/src/server-board.ts +189 -0
  295. package/templates/.agents/dashboard/packages/local-runtime/src/server-cross-layer-parity.test.ts +245 -0
  296. package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models-route.ts +64 -0
  297. package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models.test.ts +204 -0
  298. package/templates/.agents/dashboard/packages/local-runtime/src/server-daily-read-models.ts +194 -0
  299. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-pages.test.ts +163 -0
  300. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-pages.ts +354 -0
  301. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-runs-route.test.ts +74 -0
  302. package/templates/.agents/dashboard/packages/local-runtime/src/server-operations-runs-route.ts +113 -0
  303. package/templates/.agents/dashboard/packages/local-runtime/src/server-overview.test.ts +68 -0
  304. package/templates/.agents/dashboard/packages/local-runtime/src/server-period.ts +47 -0
  305. package/templates/.agents/dashboard/packages/local-runtime/src/server-projections.ts +483 -0
  306. package/templates/.agents/dashboard/packages/local-runtime/src/server-settings.test.ts +5 -2
  307. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot.test.ts +178 -84
  308. package/templates/.agents/dashboard/packages/local-runtime/src/server-workspace.ts +149 -0
  309. package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +675 -267
  310. package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +1212 -309
  311. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.test.ts +53 -0
  312. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.ts +722 -0
  313. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +3743 -0
  314. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.ts +7017 -0
  315. package/templates/.agents/dashboard/packages/local-runtime/src/work-priority-contract.test.ts +33 -0
  316. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-history.mjs +41 -0
  317. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-processes.mjs +210 -0
  318. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.mjs +514 -190
  319. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +324 -24
  320. package/templates/.agents/dashboard/packages/ui/package.json +1 -1
  321. package/templates/.agents/dashboard/packages/windows-launcher/LauncherVerificationBehaviorTests.cs +206 -0
  322. package/templates/.agents/dashboard/packages/windows-launcher/Program.cs +95 -8
  323. package/templates/.agents/dashboard/packages/windows-launcher/build-dashboard-launcher.ps1 +2 -2
  324. package/templates/.agents/dashboard/packages/windows-launcher/run-launcher-verification-tests.ps1 +22 -0
  325. package/templates/.agents/dashboard/read-model.dbml +2201 -0
  326. package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
  327. package/templates/.agents/dashboard/tests/e2e/playwright.config.ts +1 -1
  328. package/templates/.agents/dashboard/tests/e2e/specs/dashboard.spec.ts +216 -41
  329. package/templates/.agents/dashboard/work-priority.json +34 -0
  330. package/templates/.agents/dashboard/zaip-dashboard-linux.sh +45 -0
  331. package/templates/.agents/dashboard/zaip-dashboard-mac.command +3 -0
  332. package/templates/.agents/dashboard/zaip-dashboard-windows.exe +0 -0
  333. package/templates/.agents/design/.zaip-managed.json +3 -3
  334. package/templates/.agents/design/apps/catalog/package.json +1 -1
  335. package/templates/.agents/design/packages/local-runtime/package.json +1 -1
  336. package/templates/.agents/growth/estrategia-bootstrap-90-dias.md +169 -0
  337. package/templates/.agents/growth/strategy.md +27 -0
  338. package/templates/.agents/marketing/estrategia-marketing-zaip-90-dias.md +197 -0
  339. package/templates/.agents/marketing/strategy.md +29 -0
  340. package/templates/.agents/requirements/autonomous-assurance.md +1 -1
  341. package/templates/.agents/requirements/comparative-audit.md +1 -1
  342. package/templates/.agents/requirements/context-engine.md +1 -1
  343. package/templates/.agents/requirements/cost-observability.md +1 -1
  344. package/templates/.agents/requirements/dashboard-launch.md +24 -0
  345. package/templates/.agents/requirements/data-export.md +1 -1
  346. package/templates/.agents/requirements/design-system.md +1 -1
  347. package/templates/.agents/requirements/execution-engine.md +1 -1
  348. package/templates/.agents/requirements/kanban-dashboard.md +4 -3
  349. package/templates/.agents/requirements/model-orchestration.md +1 -1
  350. package/templates/.agents/requirements/public-distribution.md +9 -6
  351. package/templates/.agents/requirements/software-architecture.md +1 -1
  352. package/templates/.agents/requirements/strategic-improvements.md +1 -1
  353. package/templates/.agents/requirements/work-lifecycle.md +9 -3
  354. package/templates/.agents/requirements/zaip-strategic-95.md +4 -4
  355. package/templates/.agents/rules/autonomy-decision.md +15 -0
  356. package/templates/.agents/rules/core.md +1 -1
  357. package/templates/.agents/rules/run-lifecycle-closure.md +1 -1
  358. package/templates/.agents/rules/specialist-routing.md +19 -0
  359. package/templates/.agents/rules/workflow.md +1 -1
  360. package/templates/.agents/runtime/VERSION +1 -1
  361. package/templates/.agents/runtime/bin/zaip.mjs +118 -67
  362. package/templates/.agents/runtime/checksums.sha256 +6 -4
  363. package/templates/.agents/runtime/manifest.json +3 -1
  364. package/templates/.agents/runtime/pnpm-lock.sha256 +1 -0
  365. package/templates/.agents/runtime/provenance.json +11 -0
  366. package/templates/.agents/runtime/sbom.cdx.json +1929 -39
  367. package/templates/.agents/sales/playbook.md +32 -0
  368. package/templates/.agents/sales/roteiro-comercial-zaip.md +252 -0
  369. package/templates/.agents/skills/zaip-aios/SKILL.md +1 -1
  370. package/templates/.agents/skills/zaip-skill-brand-governance/SKILL.md +22 -0
  371. package/templates/.agents/skills/zaip-skill-brand-governance/agents/openai.yaml +4 -0
  372. package/templates/.agents/skills/zaip-skill-brand-governance/references/brandbook-framework.md +39 -0
  373. package/templates/.agents/skills/zaip-skill-brand-governance/references/brandbook-standards.md +30 -0
  374. package/templates/.agents/skills/zaip-skill-dashboard-sqlite/SKILL.md +25 -0
  375. package/templates/.agents/skills/zaip-skill-dashboard-sqlite/agents/openai.yaml +4 -0
  376. package/templates/.agents/skills/zaip-skill-enforce-architecture/SKILL.md +2 -0
  377. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/SKILL.md +18 -0
  378. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/agents/openai.yaml +6 -0
  379. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/ready-queue-fence.mjs +71 -0
  380. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/ready-queue-fence.test.mjs +60 -0
  381. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/scheduled-ready-queue-contract.test.mjs +111 -0
  382. package/templates/.agents/skills/zaip-skill-execution/SKILL.md +2 -2
  383. package/templates/.agents/skills/zaip-skill-frontend-launcher/references/launcher-contract.md +3 -1
  384. package/templates/.agents/skills/zaip-skill-general-operations/SKILL.md +12 -0
  385. package/templates/.agents/skills/zaip-skill-general-operations/agents/openai.yaml +4 -0
  386. package/templates/.agents/skills/zaip-skill-github-deploy/SKILL.md +9 -7
  387. package/templates/.agents/skills/zaip-skill-github-deploy/agents/openai.yaml +2 -2
  388. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-deploy-contract.test.mjs +11 -38
  389. package/templates/.agents/skills/zaip-skill-governance-compliance/SKILL.md +12 -0
  390. package/templates/.agents/skills/zaip-skill-governance-compliance/agents/openai.yaml +4 -0
  391. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/SKILL.md +21 -0
  392. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/agents/openai.yaml +4 -0
  393. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/references/growth-revops-framework.md +25 -0
  394. package/templates/.agents/skills/zaip-skill-instalar-agendamento/SKILL.md +17 -0
  395. package/templates/.agents/skills/zaip-skill-instalar-agendamento/agents/openai.yaml +6 -0
  396. package/templates/.agents/skills/zaip-skill-marketing/SKILL.md +9 -3
  397. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-local-telemetry.mjs +99 -93
  398. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.mjs +132 -23
  399. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.test.mjs +149 -1
  400. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.mjs +76 -19
  401. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.test.mjs +217 -7
  402. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/source-size-telemetry/model-identity-reconciliation.mjs +77 -0
  403. package/templates/.agents/skills/zaip-skill-sales-methodology/SKILL.md +20 -0
  404. package/templates/.agents/skills/zaip-skill-sales-methodology/agents/openai.yaml +4 -0
  405. package/templates/.agents/skills/zaip-skill-sales-methodology/references/sales-process-framework.md +77 -0
  406. package/templates/.agents/skills/zaip-skill-setup/SKILL.md +5 -0
  407. package/templates/.agents/skills/zaip-skill-sqlite-read-model/SKILL.md +96 -0
  408. package/templates/.agents/skills/zaip-skill-sqlite-read-model/agents/openai.yaml +4 -0
  409. package/templates/.agents/skills/zaip-skill-sqlite-read-model/scripts/ensure-node.mjs +41 -0
  410. package/templates/.agents/zaip-aios/INDEX.md +11 -0
  411. package/templates/.agents/zaip-aios/README.md +38 -8
  412. package/templates/.agents/zaip-aios/VERSION +1 -1
  413. package/templates/.agents/zaip-aios/guides/09-agentes-e-squads.md +43 -6
  414. package/templates/.agents/zaip-aios/guides/10-seguranca.md +21 -7
  415. package/templates/.agents/zaip-aios/guides/17-como-o-custo-e-calculado.md +32 -0
  416. package/templates/.agents/zaip-aios/guides/18-catalogo-de-agentes.md +76 -0
  417. package/templates/.agents/zaip-aios/guides/19-assurance-e-autonomia.md +72 -0
  418. package/templates/.agents/zaip-aios/guides/20-instalacao-detalhada.md +330 -0
  419. package/templates/.agents/zaip-aios/guides/21-telemetria-monitor-custos.md +52 -0
  420. package/templates/.agents/zaip-aios/guides/22-fluxos-e-roteamento.md +69 -0
  421. package/templates/.agents/zaip-aios/guides/23-orquestracao-de-modelos.md +483 -0
  422. package/templates/.agents/zaip-aios/guides/24-calculo-de-custos-openai.md +85 -0
  423. package/templates/.agents/zaip-aios/guides/25-fontes-de-precos-openai.md +18 -0
  424. package/templates/.agents/zaip-aios/guides/26-qualidade-e-release.md +44 -0
  425. package/templates/.agents/zaip-aios/guides/27-telemetria-git-native.md +167 -0
  426. package/templates/.agents/zaip-aios/guides/28-lifecycle-completo.md +144 -0
  427. package/templates/.agents/zaip-aios/guides/assets/diagrams/lifecycles-task-spec-prd.png +0 -0
  428. package/templates/.agents/zaip-aios/guides/assets/diagrams/prd-lifecycle.png +0 -0
  429. package/templates/.agents/zaip-aios/guides/assets/diagrams/spec-lifecycle.png +0 -0
  430. package/templates/.agents/zaip-aios/guides/assets/diagrams/task-lifecycle.png +0 -0
  431. package/templates/template-manifest.json +1082 -215
  432. package/templates/.agents/dashboard/apps/frontend/dist/assets/AgentCatalogSettingsPage-CLYIi7Vo.js +0 -1
  433. package/templates/.agents/dashboard/apps/frontend/dist/assets/AgentCatalogSettingsPage-DTDNVQGX.css +0 -1
  434. package/templates/.agents/dashboard/apps/frontend/dist/assets/DashboardHelpDialog-Cv-JcoxP.js +0 -1320
  435. package/templates/.agents/dashboard/apps/frontend/dist/assets/PricingSettingsDialog-CzEggcRb.js +0 -1
  436. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-05YKn6Z4.js +0 -3
  437. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-YO3yqtgV.css +0 -1
  438. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-8AzCnl3a.js +0 -77
  439. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-DdBYQ_8D.css +0 -1
  440. package/templates/.agents/dashboard/apps/frontend/src/AgentCatalogSettingsPage.tsx +0 -617
  441. package/templates/.agents/dashboard/apps/frontend/src/agent-catalog-settings-page.css +0 -660
  442. package/templates/.agents/dashboard/apps/frontend/src/agent-catalog-settings.test.ts +0 -249
  443. package/templates/.agents/dashboard/dashboard.config.json +0 -4
  444. package/templates/.agents/dashboard/zaip-dashboard.exe +0 -0
@@ -1,6 +1,7 @@
1
- import { appendFile, open, readFile, rm } from "node:fs/promises";
1
+ import { open, readFile, rename, rm, writeFile } from "node:fs/promises";
2
2
  import {
3
3
  aggregate,
4
+ exactCompletedSegment,
4
5
  exactRemeasurementSegment,
5
6
  jsonLines,
6
7
  pricingFor,
@@ -9,6 +10,7 @@ import {
9
10
  recordType,
10
11
  usageStatus,
11
12
  usageView,
13
+ withSequence,
12
14
  } from "./reconcile-telemetry-lib.mjs";
13
15
 
14
16
  export const remeasureSelectedRuns = async ({
@@ -26,19 +28,35 @@ export const remeasureSelectedRuns = async ({
26
28
  remeasurement.push({ run_id: runId, eligible: false, reason: "run-not-found" });
27
29
  continue;
28
30
  }
29
- const effective = usageStatus(run.usage).effective.filter(
30
- (usage) => usage.tokens?.input !== null && usage.tokens?.output !== null,
31
- );
31
+ const effectiveUsage = usageStatus(run.usage).effective;
32
+ const effective = timingOnly
33
+ ? effectiveUsage
34
+ : effectiveUsage.filter(
35
+ (usage) => usage.tokens?.input !== null && usage.tokens?.output !== null,
36
+ );
32
37
  const superseded = effective.at(-1) ?? null;
33
38
  const finished = run.records.find((record) => recordType(record) === "run.finished");
34
- const match = exactRemeasurementSegment(
35
- run.started,
36
- superseded?.source_segment_key,
37
- allSegments,
38
- );
39
+ // Timing-only reconciliation is deliberately narrower than normal
40
+ // remeasurement: it may enrich a missing source interval only when the
41
+ // persisted client turn identifies exactly one completed local segment.
42
+ const match = timingOnly
43
+ ? exactCompletedSegment(run.started, allSegments)
44
+ : exactRemeasurementSegment(
45
+ run.started,
46
+ superseded?.source_segment_key,
47
+ allSegments,
48
+ superseded?.source_occurred_at,
49
+ superseded?.tokens,
50
+ );
39
51
  const segment = match.segment;
40
52
  const ambiguous = match.ambiguous;
41
- if (!finished || segment === null || ambiguous || superseded === null) {
53
+ if (
54
+ !finished ||
55
+ segment === null ||
56
+ segment.finished_at === null ||
57
+ ambiguous ||
58
+ superseded === null
59
+ ) {
42
60
  remeasurement.push({
43
61
  run_id: runId,
44
62
  eligible: false,
@@ -121,36 +139,75 @@ export const remeasureSelectedRuns = async ({
121
139
  return remeasurement;
122
140
  };
123
141
 
142
+ export function timingEnrichmentRunIds({ remeasure, applyBackfill, selectedRunIds, runs }) {
143
+ if (remeasure) return selectedRunIds;
144
+ if (!applyBackfill) return new Set();
145
+ return new Set(
146
+ runs
147
+ .filter(
148
+ (run) =>
149
+ run.nativeMeasured && run.records.some((record) => recordType(record) === "run.finished"),
150
+ )
151
+ .map((run) => run.started.run_id),
152
+ );
153
+ }
154
+
124
155
  export async function appendRetrospectiveUsage(file, expectedRecords, event) {
125
- assertRetrospectiveAppend(expectedRecords, event);
156
+ assertRetrospectiveAppend(expectedRecords, event, { allowPostTerminalCorrections: true });
126
157
  const lockPath = `${file}.lock`;
127
158
  const handle = await open(lockPath, "wx");
128
159
  await handle.close();
129
160
  try {
130
161
  const persisted = jsonLines(await readFile(file, "utf8"));
131
- const expectedLast = expectedRecords.at(-1);
132
- const persistedLast = persisted.at(-1);
162
+ const expectedIds = expectedRecords.map((record) => record?.event_id ?? record?.[2]);
163
+ const persistedIds = persisted.map((record) => record?.event_id ?? record?.[2]);
133
164
  if (
134
165
  persisted.length !== expectedRecords.length ||
135
- recordSequence(persistedLast) !== recordSequence(expectedLast) ||
136
- recordType(persistedLast) !== "run.finished"
166
+ persistedIds.some((id, index) => id !== expectedIds[index])
137
167
  ) {
138
168
  throw new Error("Run history changed before retrospective append");
139
169
  }
140
- assertRetrospectiveAppend(persisted, event);
141
- await appendFile(file, `${JSON.stringify(event)}\n`, "utf8");
170
+ assertRetrospectiveAppend(persisted, event, { allowPostTerminalCorrections: true });
171
+ const finishIndex = persisted.findIndex((record) => recordType(record) === "run.finished");
172
+ const beforeFinish = persisted.slice(0, finishIndex);
173
+ const finish = persisted[finishIndex];
174
+ const historicalCorrections = persisted.slice(finishIndex + 1);
175
+ const updated = [...beforeFinish, ...historicalCorrections, event, finish].map(
176
+ (record, index) => withSequence(record, index + 1),
177
+ );
178
+ const temporary = `${file}.remeasure.tmp`;
179
+ await writeFile(
180
+ temporary,
181
+ `${updated.map((record) => JSON.stringify(record)).join("\n")}\n`,
182
+ "utf8",
183
+ );
184
+ await rename(temporary, file);
142
185
  } finally {
143
186
  await rm(lockPath, { force: true });
144
187
  }
145
188
  }
146
189
 
147
- export function assertRetrospectiveAppend(records, event) {
148
- const finished = records.at(-1);
190
+ export function assertRetrospectiveAppend(
191
+ records,
192
+ event,
193
+ { allowPostTerminalCorrections = false } = {},
194
+ ) {
195
+ const finishIndex = records.findIndex((record) => recordType(record) === "run.finished");
196
+ const finished = records[finishIndex];
149
197
  const target = records.find(
150
198
  (record) => usageView(record)?.event_id === event.supersedes_event_id,
151
199
  );
152
200
  if (
153
201
  recordType(finished) !== "run.finished" ||
202
+ (!allowPostTerminalCorrections && finishIndex !== records.length - 1) ||
203
+ (allowPostTerminalCorrections &&
204
+ records
205
+ .slice(finishIndex + 1)
206
+ .some(
207
+ (record) =>
208
+ usageView(record)?.activity_kind !== "retrospective_local_remeasurement" ||
209
+ usageView(record)?.retrospective_correction !== true,
210
+ )) ||
154
211
  event.type !== "usage.recorded" ||
155
212
  event.retrospective_correction !== true ||
156
213
  event.activity_kind !== "retrospective_local_remeasurement" ||
@@ -9,12 +9,34 @@ import {
9
9
  assertRetrospectiveAppend,
10
10
  remeasureSelectedRuns,
11
11
  retrospectiveCorrectionOccurredAt,
12
+ timingEnrichmentRunIds,
12
13
  } from "./reconcile-telemetry-remeasurement.mjs";
13
14
 
14
15
  const roots = [];
15
16
  after(async () => Promise.all(roots.map((root) => rm(root, { recursive: true, force: true }))));
16
17
 
17
- test("appends under an exclusive lock without rewriting the terminal history", async () => {
18
+ test("selects completed native Runs for default timing-only backfill", () => {
19
+ const selected = timingEnrichmentRunIds({
20
+ remeasure: false,
21
+ applyBackfill: true,
22
+ selectedRunIds: new Set(),
23
+ runs: [
24
+ {
25
+ nativeMeasured: true,
26
+ started: { run_id: "RUN-NATIVE" },
27
+ records: [{ type: "run.started" }, { type: "run.finished" }],
28
+ },
29
+ {
30
+ nativeMeasured: true,
31
+ started: { run_id: "RUN-RUNNING" },
32
+ records: [{ type: "run.started" }],
33
+ },
34
+ ],
35
+ });
36
+ assert.deepEqual([...selected], ["RUN-NATIVE"]);
37
+ });
38
+
39
+ test("inserts a correction before the terminal event under an exclusive lock", async () => {
18
40
  const root = await mkdtemp(join(tmpdir(), "zaip-remeasure-append-"));
19
41
  roots.push(root);
20
42
  const file = join(root, "RUN.jsonl");
@@ -38,8 +60,51 @@ test("appends under an exclusive lock without rewriting the terminal history", a
38
60
  await appendRetrospectiveUsage(file, records, correction);
39
61
 
40
62
  const persisted = await readFile(file, "utf8");
41
- assert.ok(persisted.startsWith(original));
42
- assert.equal(persisted, `${original}${JSON.stringify(correction)}\n`);
63
+ const events = jsonLines(persisted);
64
+ assert.equal(events.at(-2).event_id, correction.event_id);
65
+ assert.equal(events.at(-1).type, "run.finished");
66
+ assert.deepEqual(
67
+ events.map((event) => event.sequence),
68
+ [1, 2, 3, 4],
69
+ );
70
+ });
71
+
72
+ test("restores historical retrospective corrections before the terminal event", async () => {
73
+ const root = await mkdtemp(join(tmpdir(), "zaip-remeasure-restore-"));
74
+ roots.push(root);
75
+ const file = join(root, "RUN.jsonl");
76
+ const records = [
77
+ { type: "run.started", event_id: "RUN:1", sequence: 1, phase: "execution" },
78
+ { type: "usage.recorded", event_id: "RUN:2", sequence: 2, phase: "execution" },
79
+ { type: "run.finished", event_id: "RUN:3", sequence: 3, phase: "execution" },
80
+ {
81
+ type: "usage.recorded",
82
+ event_id: "RUN:4",
83
+ sequence: 4,
84
+ phase: "execution",
85
+ activity_kind: "retrospective_local_remeasurement",
86
+ retrospective_correction: true,
87
+ },
88
+ ];
89
+ await writeFile(file, `${records.map((record) => JSON.stringify(record)).join("\n")}\n`, "utf8");
90
+ await appendRetrospectiveUsage(file, records, {
91
+ type: "usage.recorded",
92
+ event_id: "RUN:5",
93
+ sequence: 5,
94
+ phase: "execution",
95
+ activity_kind: "retrospective_local_remeasurement",
96
+ supersedes_event_id: "RUN:2",
97
+ retrospective_correction: true,
98
+ });
99
+ const events = jsonLines(await readFile(file, "utf8"));
100
+ assert.deepEqual(
101
+ events.map((event) => event.event_id),
102
+ ["RUN:1", "RUN:2", "RUN:4", "RUN:5", "RUN:3"],
103
+ );
104
+ assert.deepEqual(
105
+ events.map((event) => event.sequence),
106
+ [1, 2, 3, 4, 5],
107
+ );
43
108
  });
44
109
 
45
110
  test("an unavailable lock leaves the original history byte-identical", async () => {
@@ -151,17 +216,17 @@ test("uses run.finished phase after planning transitions to execution and reread
151
216
  workspace: root,
152
217
  });
153
218
  const persisted = jsonLines(await readFile(file, "utf8"));
154
- const correction = usageView(persisted.at(-1));
219
+ const correction = usageView(persisted.at(-2));
155
220
  assert.equal(result.applied, true);
156
221
  assert.equal(correction.phase, "execution");
157
222
  assert.equal(usageStatus([...run.usage, correction]).effective.at(-1).tokens.total, 9);
158
223
  assert.throws(
159
- () => assertRetrospectiveAppend(records, { ...persisted.at(-1), phase: "planning" }),
224
+ () => assertRetrospectiveAppend(records, { ...persisted.at(-2), phase: "planning" }),
160
225
  /Invalid retrospective/,
161
226
  );
162
227
  });
163
228
 
164
- test("enriches exact source timing without changing canonical tokens when remeasurement drifts", async () => {
229
+ test("timing-only preserves exact measured tokens and cost while enriching source timing", async () => {
165
230
  const root = await mkdtemp(join(tmpdir(), "zaip-remeasure-timing-"));
166
231
  roots.push(root);
167
232
  await mkdir(join(root, ".agents", "config", "pricing"), { recursive: true });
@@ -198,6 +263,7 @@ test("enriches exact source timing without changing canonical tokens when remeas
198
263
  phase: "execution",
199
264
  activity_kind: "retrospective_local_reconciliation",
200
265
  tokens: { input: 10, cached_input: 0, output: 2, reasoning: 0, total: 12 },
266
+ cost: { usd: 0.000012, brl: 0.00006, fx_rate: 5 },
201
267
  supersedes_event_id: null,
202
268
  source_segment_key: "session#timing",
203
269
  source_occurred_at: "2026-07-25T04:01:00.000Z",
@@ -217,6 +283,7 @@ test("enriches exact source timing without changing canonical tokens when remeas
217
283
  records,
218
284
  started: {
219
285
  run_id: "RUN-TIMING",
286
+ occurred_at: "2026-07-25T04:00:00.000Z",
220
287
  phase: "execution",
221
288
  client_turn_id: "turn-timing",
222
289
  model: "gpt-test",
@@ -249,15 +316,158 @@ test("enriches exact source timing without changing canonical tokens when remeas
249
316
  timingOnly: true,
250
317
  workspace: root,
251
318
  });
252
- const correction = usageView(jsonLines(await readFile(file, "utf8")).at(-1));
319
+ const correction = usageView(jsonLines(await readFile(file, "utf8")).at(-2));
253
320
  assert.equal(result.unchanged, false);
254
321
  assert.equal(result.timing_enrichment, true);
322
+ assert.equal(result.eligible, true);
255
323
  assert.equal(result.applied, true);
256
324
  assert.equal(correction.tokens.total, 12);
325
+ assert.deepEqual(correction.tokens, usageView(records[1]).tokens);
326
+ assert.deepEqual(correction.cost, usageView(records[1]).cost);
327
+ assert.equal(correction.source_started_at, segment.started_at);
328
+ assert.equal(correction.source_finished_at, segment.finished_at);
329
+ });
330
+
331
+ test("timing-only appends exact source timing while preserving null tokens and cost", async () => {
332
+ const root = await mkdtemp(join(tmpdir(), "zaip-remeasure-null-timing-"));
333
+ roots.push(root);
334
+ const file = join(root, "RUN-NULL.jsonl");
335
+ const records = timingRunRecords("RUN-NULL", "turn-null", {
336
+ input: null,
337
+ cached_input: null,
338
+ output: null,
339
+ reasoning: null,
340
+ total: null,
341
+ });
342
+ await writeFile(file, `${records.map((record) => JSON.stringify(record)).join("\n")}\n`);
343
+ const run = timingRun(file, records, "RUN-NULL", "turn-null");
344
+ const segment = completedSegment("segment-null", "turn-null");
345
+
346
+ const [result] = await remeasureSelectedRuns({
347
+ apply: true,
348
+ allSegments: [segment],
349
+ runs: [run],
350
+ selectedRunIds: new Set(["RUN-NULL"]),
351
+ timingOnly: true,
352
+ workspace: root,
353
+ });
354
+ const correction = usageView(jsonLines(await readFile(file, "utf8")).at(-2));
355
+ assert.equal(result.eligible, true);
356
+ assert.equal(result.applied, true);
357
+ assert.deepEqual(correction.tokens, records[1].tokens);
358
+ assert.deepEqual(correction.cost, records[1].cost);
257
359
  assert.equal(correction.source_started_at, segment.started_at);
258
360
  assert.equal(correction.source_finished_at, segment.finished_at);
259
361
  });
260
362
 
363
+ test("timing-only rejects a mismatched or ambiguous client turn without appending", async () => {
364
+ const root = await mkdtemp(join(tmpdir(), "zaip-remeasure-exact-turn-"));
365
+ roots.push(root);
366
+ for (const [runId, turnId, segments, reason] of [
367
+ [
368
+ "RUN-MISMATCH",
369
+ "turn-persisted",
370
+ [completedSegment("segment-other", "turn-other")],
371
+ "exact-segment-not-found",
372
+ ],
373
+ [
374
+ "RUN-AMBIGUOUS",
375
+ "turn-ambiguous",
376
+ [
377
+ completedSegment("segment-one", "turn-ambiguous"),
378
+ completedSegment("segment-two", "turn-ambiguous"),
379
+ ],
380
+ "ambiguous-segment",
381
+ ],
382
+ ]) {
383
+ const file = join(root, `${runId}.jsonl`);
384
+ const records = timingRunRecords(runId, turnId, {
385
+ input: null,
386
+ cached_input: null,
387
+ output: null,
388
+ reasoning: null,
389
+ total: null,
390
+ });
391
+ await writeFile(file, `${records.map((record) => JSON.stringify(record)).join("\n")}\n`);
392
+ const [result] = await remeasureSelectedRuns({
393
+ apply: true,
394
+ allSegments: segments,
395
+ runs: [timingRun(file, records, runId, turnId)],
396
+ selectedRunIds: new Set([runId]),
397
+ timingOnly: true,
398
+ workspace: root,
399
+ });
400
+ assert.equal(result.eligible, false);
401
+ assert.equal(result.reason, reason);
402
+ assert.deepEqual(jsonLines(await readFile(file, "utf8")), records);
403
+ }
404
+ });
405
+
406
+ function timingRunRecords(runId, turnId, tokens) {
407
+ return [
408
+ {
409
+ type: "run.started",
410
+ event_id: `${runId}:1`,
411
+ run_id: runId,
412
+ sequence: 1,
413
+ occurred_at: "2026-07-29T12:29:45.637Z",
414
+ phase: "execution",
415
+ client_turn_id: turnId,
416
+ },
417
+ {
418
+ type: "usage.recorded",
419
+ event_id: `${runId}:2`,
420
+ run_id: runId,
421
+ sequence: 2,
422
+ occurred_at: "2026-07-29T12:30:00.000Z",
423
+ phase: "execution",
424
+ tokens,
425
+ cost: { usd: null, brl: null },
426
+ supersedes_event_id: null,
427
+ },
428
+ {
429
+ type: "run.finished",
430
+ event_id: `${runId}:3`,
431
+ run_id: runId,
432
+ sequence: 3,
433
+ occurred_at: "2026-07-29T12:31:00.000Z",
434
+ phase: "execution",
435
+ },
436
+ ];
437
+ }
438
+
439
+ function timingRun(file, records, runId, turnId) {
440
+ return {
441
+ file,
442
+ records,
443
+ started: {
444
+ run_id: runId,
445
+ occurred_at: "2026-07-29T12:29:45.637Z",
446
+ phase: "execution",
447
+ client_turn_id: turnId,
448
+ },
449
+ usage: records.map(usageView).filter(Boolean),
450
+ };
451
+ }
452
+
453
+ function completedSegment(key, turnId) {
454
+ return {
455
+ key,
456
+ turn_id: turnId,
457
+ started_at: "2026-07-29T12:29:45.637Z",
458
+ finished_at: "2026-07-29T12:40:07.773Z",
459
+ usage: [
460
+ {
461
+ input_tokens: 10,
462
+ cached_input_tokens: 0,
463
+ output_tokens: 2,
464
+ reasoning_output_tokens: 0,
465
+ total_tokens: 12,
466
+ },
467
+ ],
468
+ };
469
+ }
470
+
261
471
  test("uses the current correction clock instead of fabricating a pre-finish timestamp", () => {
262
472
  const current = new Date("2026-07-25T04:06:14.352Z");
263
473
  assert.equal(
@@ -0,0 +1,77 @@
1
+ import { rename, writeFile } from "node:fs/promises";
2
+
3
+ export async function reconcileGenericModelIdentities({
4
+ applyBackfill,
5
+ pricingFor,
6
+ runs,
7
+ segments,
8
+ usageView,
9
+ withSequence,
10
+ workspace,
11
+ }) {
12
+ const segmentsByKey = new Map(segments.map((segment) => [segment.key, segment]));
13
+ const genericModel = (model) => typeof model === "string" && /^gpt-5$/i.test(model.trim());
14
+ let correctionsCount = 0;
15
+ for (const run of runs) {
16
+ const superseded = new Set(run.usage.map((usage) => usage.supersedes_event_id).filter(Boolean));
17
+ const effective = run.usage.filter((usage) => !superseded.has(usage.event_id));
18
+ const corrections = effective.flatMap((usage) => {
19
+ if (!genericModel(usage.model ?? run.started.model)) return [];
20
+ const segment = usage.source_segment_key
21
+ ? (segmentsByKey.get(usage.source_segment_key) ?? null)
22
+ : null;
23
+ return segment?.model && !genericModel(segment.model) ? [{ usage, segment }] : [];
24
+ });
25
+ correctionsCount += corrections.length;
26
+ if (!applyBackfill || corrections.length === 0) continue;
27
+
28
+ const correctionByTarget = new Map(corrections.map((item) => [item.usage.event_id, item]));
29
+ const updated = [];
30
+ let correctionIndex = run.usage.filter(
31
+ (usage) => usage.activity_kind === "model_identity_reconciliation",
32
+ ).length;
33
+ for (const record of run.records) {
34
+ updated.push(record);
35
+ const original = usageView(record);
36
+ const correction = original ? correctionByTarget.get(original.event_id) : null;
37
+ if (!correction) continue;
38
+ correctionIndex += 1;
39
+ const cost = await pricingFor(workspace, correction.segment.model, original.tokens);
40
+ updated.push({
41
+ schema_version: 2,
42
+ event_id: `${run.started.run_id}:model:${String(correctionIndex).padStart(6, "0")}`,
43
+ run_id: run.started.run_id,
44
+ sequence: 0,
45
+ occurred_at: original.occurred_at,
46
+ type: "usage.recorded",
47
+ phase: original.phase,
48
+ activity_kind: "model_identity_reconciliation",
49
+ classification_source: original.classification_source ?? "current_context",
50
+ tokens: original.tokens,
51
+ cost,
52
+ provider: original.provider ?? run.started.provider ?? "openai",
53
+ model: correction.segment.model,
54
+ source_segment_key: original.source_segment_key,
55
+ supersedes_event_id: original.event_id,
56
+ source_occurred_at:
57
+ original.source_occurred_at ??
58
+ correction.segment.finished_at ??
59
+ correction.segment.started_at,
60
+ ...(original.context_stats === undefined ? {} : { context_stats: original.context_stats }),
61
+ runtime: {
62
+ reasoning_effort: correction.segment.effort ?? original.runtime?.reasoning_effort ?? null,
63
+ service_tier: correction.segment.service_tier ?? original.runtime?.service_tier ?? null,
64
+ },
65
+ });
66
+ }
67
+ const resequenced = updated.map((record, index) => withSequence(record, index + 1));
68
+ const temporary = `${run.file}.model.tmp`;
69
+ await writeFile(
70
+ temporary,
71
+ `${resequenced.map((record) => JSON.stringify(record)).join("\n")}\n`,
72
+ "utf8",
73
+ );
74
+ await rename(temporary, run.file);
75
+ }
76
+ return correctionsCount;
77
+ }
@@ -0,0 +1,20 @@
1
+ ---
2
+ name: zaip-skill-sales-methodology
3
+ description: Design evidence-backed sales processes, qualification playbooks, and configurable scripts. Use for internal sales-methodology work; not for external commercial acts or campaign production.
4
+ ---
5
+
6
+ # Metodologia comercial
7
+
8
+ ## Localização canônica
9
+
10
+ Salve processos comerciais, playbooks, scripts internos, matrizes de objeções e materiais de enablement em `.agents/sales/`. Não salve esses artefatos em `docs/`, na raiz do repositório ou em diretórios de brand, marketing ou growth.
11
+
12
+ O arquivo central da área é `.agents/sales/playbook.md`; atualize-o quando uma decisão mudar o processo comercial, qualificação, handoff ou narrativa sales-facing. Materiais específicos podem ser arquivos adicionais na mesma pasta.
13
+
14
+ 1. Delimite empresa, oferta, ICP, persona, canal, origem inbound/outbound, etapa, nível de awareness, complexidade, ticket, ciclo, regiões, compliance e autoridade. Separe fato, evidência, hipótese e decisão; não fabrique consciência, urgência, prova, ROI, preço ou autoridade.
15
+ 2. Desenhe um playbook por etapa com objetivo, dono, entrada, abertura, perguntas, evidência, campos SPIN/BANT, transição, objeções, prova autorizada, microcompromisso, saída, CRM, handoff/SLA e próximo passo. Inclua caminhos de not-qualified, nurture e no-decision.
16
+ 3. Use as três etapas ZAIP: descoberta/pré-qualificação (tipicamente SDR), alinhamento/qualificação com handoff definido para closer, e fechamento/negociação pelo closer. O preço só pode ser apresentado como aprovado; proposta e contrato seguem o handoff autorizado.
17
+ 4. Aplique SPIN como banco adaptativo de Situation, Problem, Implication e Need-payoff, nunca como interrogatório ou ordem rígida. Use BANT como campos e gates de evidência (Budget, Authority, Need, Timing), nunca para pressionar ou desqualificar de forma manipulativa.
18
+ 5. Adapte narrativa, perguntas e CTA a unaware, problem-aware, solution-aware, product-aware e most-aware somente quando houver evidência do estágio. Use o roteiro genérico de qualificação curta e a estrutura de fechamento em [referência de processo](references/sales-process-framework.md).
19
+ 6. Aaron somente desenha ou melhora processo, playbook e script internos. Não contata prospects, envia proposta ou link de pagamento, altera preço/desconto, assina contrato nem executa ato comercial externo ou vinculante sem autoridade explícita.
20
+ 7. Encaminhe estratégia Growth/RevOps, estratégia empresarial e economia end-to-end para Robert; campanha e copy de aquisição para Lúcia; marca e tom ainda não decididos para Sarah; dados e métodos quantitativos para Gabi; políticas ou limites legais para Renata; e produção documental genérica para Clara. Sales-facing scripts e enablement pertencem a Aaron; copy de campanha pertence a Lúcia.
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "Sales Specialist"
3
+ short_description: "Design evidence-based sales process and playbooks."
4
+ default_prompt: "Use $zaip-skill-sales-methodology to design a compliant sales process or playbook."
@@ -0,0 +1,77 @@
1
+ # Framework de processo comercial
2
+
3
+ ## Fronteira e papéis
4
+
5
+ O papel separa prospecção/SDR, qualificação inbound, closer/AE e gestão de conta ou Customer Success quando a operação exigir especialização. Aaron documenta as interfaces e os handoffs, mas não substitui a decisão de capacidade, estratégia de canal ou economia do funil de Robert.
6
+
7
+ ## Princípios adaptados
8
+
9
+ Use Positioning, Pace e Practice como lentes de diagnóstico: adequação da narrativa ao mercado, ritmo e investimento autorizados, e capacidade de transformar o plano em prática observável. Organize o playbook nos blocos Targeting, Tools, Prospecting, Qualification e Follow-through. São uma adaptação conceitual das fontes listadas, não uma cópia nem uma sequência obrigatória.
10
+
11
+ ## Gates das três etapas
12
+
13
+ | Etapa | Dono típico | Entrada | Saída | Handoff |
14
+ | --- | --- | --- | --- | --- |
15
+ | Descoberta e pré-qualificação | SDR | Lead ou conta elegível com origem registrada | Dor, urgência e contato adequado registrados, ou rota alternativa | Qualificação, nurture ou not-qualified |
16
+ | Alinhamento e qualificação | SDR com closer definido | Contexto mínimo e interesse verificável | Fit, necessidade e próximo passo documentados antes de discutir preço | Handoff com CRM e SLA acordado ao closer |
17
+ | Fechamento e negociação | Closer | Oportunidade aceita e escopo de conversa autorizado | Próximo passo, proposta ou contrato somente por fluxo autorizado; ou no-decision | Proposta/contrato autorizado, nurture ou encerramento registrado |
18
+
19
+ Os gates são critérios de evidência, não metas de pressão. Dados indisponíveis ficam explícitos como lacuna.
20
+
21
+ ## Playbook configurável
22
+
23
+ Configure empresa, oferta, ICP, persona, canal, origem, etapa, awareness, complexidade, ticket, ciclo, região e limites de compliance. Para cada etapa, registre objetivo, dono, critérios de entrada e saída, abertura, banco de perguntas, evidências, campos SPIN/BANT, transição, objeções, prova autorizada, microcompromisso, registro de CRM, handoff/SLA e próximo passo.
24
+
25
+ Os três estágios ZAIP são: descoberta e pré-qualificação (dor, urgência e contato adequado); alinhamento e qualificação (fit e solução antes de preço, com handoff definido); e fechamento e negociação (closer, preço aprovado, objeções e próximo passo autorizado). Rotas explícitas para `not-qualified`, `nurture` e `no-decision` evitam fabricar avanço de pipeline.
26
+
27
+ ### Contrato de saída do script
28
+
29
+ Um script reutilizável retorna campos configuráveis: `empresa`, `oferta`, `ICP`, `persona`, `canal`, `origem`, `etapa`, `awareness`, `complexidade`, `ticket`, `ciclo`, `região`, `compliance`, `objetivo`, `dono`, `entry_criteria`, `abertura`, `perguntas`, `evidências`, `BANT`, `SPIN`, `objeções`, `prova_autorizada`, `microcompromisso`, `exit_criteria`, `CRM`, `handoff_SLA` e `next_step`. O valor de cada campo pode ser placeholder neutro; campos ausentes não devem ser preenchidos por inferência.
30
+
31
+ ## Qualificação curta: outline configurável
32
+
33
+ O modelo abaixo usa uma duração curta configurável (por exemplo, dez minutos), sem promessa rígida.
34
+
35
+ 1. Confirme contexto e permissão para a conversa.
36
+ 2. Declare a agenda ou objetivo em termos neutros.
37
+ 3. Verifique empresa, papel e origem conhecidos.
38
+ 4. Explore situação e prioridade atual.
39
+ 5. Pergunte por problema ou impacto já declarado.
40
+ 6. Investigue implicações sem presumir perda, risco ou urgência.
41
+ 7. Convide a pessoa a definir o valor de uma solução adequada.
42
+ 8. Registre participantes, processo decisório e BANT conhecido, desconhecido ou não aplicável.
43
+ 9. Recapitule somente o que foi confirmado e cheque o fit.
44
+ 10. Acorde informações obrigatórias, microcompromisso e próximo passo autorizado.
45
+
46
+ Os itens 1–3 formam abertura/contexto; 4–8, diagnóstico; e 9–10, preparação/transição.
47
+
48
+ SPIN organiza um banco de perguntas adaptável: Situation busca contexto já conhecido; Problem explora dificuldade declarada; Implication pergunta por consequências sem alegá-las; Need-payoff convida a pessoa a descrever valor. BANT registra Budget, Authority, Need e Timing com estado `known`, `unknown` ou `not-applicable`, fonte e data. Esses estados são evidência ou lacuna, nunca justificativa para pressão.
49
+
50
+ | Awareness | Narrativa | CTA |
51
+ | --- | --- | --- |
52
+ | unaware | Contexto e hipótese aberta, sem presumir problema | Pedir permissão para explorar relevância |
53
+ | problem-aware | Dor já declarada e impacto confirmado | Convidar diagnóstico adicional |
54
+ | solution-aware | Critérios e alternativas reconhecidas | Alinhar critérios de avaliação |
55
+ | product-aware | Oferta e fit sob análise | Confirmar lacunas e próximo passo |
56
+ | most-aware | Informação previamente confirmada | Propor ação permitida e reversível |
57
+
58
+ ## Fechamento e negociação: outline configurável
59
+
60
+ Um fechamento mais longo pode seguir: (1) rapport e contexto; (2) diagnóstico de dor, impacto e prioridade; (3) riscos e acordo sobre o problema; (4) solução ligada apenas às dores confirmadas; (5) prova autorizada; (6) objeções antes de preço; (7) preço e escopo aprovados; (8) negociação dentro da autoridade; e (9) handoff de proposta ou contrato autorizado. Não inclua depoimentos, ROI, escassez, descontos, links de pagamento ou alegações legais sem evidência e autorização.
61
+
62
+ ## Checklist de QA
63
+
64
+ - Cada etapa contém dono, entrada, saída, CRM e handoff/SLA.
65
+ - Perguntas e transições permanecem adaptáveis; não simulam necessidade, urgência ou consciência.
66
+ - BANT/SPIN distinguem evidência de lacuna e não usam coerção.
67
+ - Preço, proposta, desconto, contrato e negociação permanecem sob aprovação e autoridade explícitas.
68
+ - Provas, ROI, depoimentos e claims legais só aparecem quando autorizados e rastreáveis.
69
+ - Rotas `not-qualified`, `nurture` e `no-decision` existem e não são tratadas como falha do prospect.
70
+
71
+ ## Referências metodológicas
72
+
73
+ - Predictable Revenue, [Sales Development Methodology](https://predictablerevenue.com/methodology/): referência para separar princípios estratégicos de playbook e para os blocos targeting, tools, prospecting, qualification e follow-through.
74
+ - Predictable Revenue, [Specialize Your Sales Roles](https://predictablerevenue.com/guides/specialize-your-sales-roles/): referência para especialização de papéis e handoffs entre funções comerciais.
75
+ - Huthwaite International, [origem do acrônimo SPIN](https://www.huthwaiteinternational.com/blog/spin-acronym): referência para os conceitos Situation, Problem, Implication e Need-payoff.
76
+
77
+ As fontes são referência conceitual. Não reproduza conteúdo proprietário, não converta seus exemplos em regras rígidas e não introduza afirmações, nomes, preços, descontos, links ou obrigações externas.
@@ -5,6 +5,11 @@ description: Install, diagnose, migrate, upgrade, or roll back ZAIP configuratio
5
5
 
6
6
  # Configurar ZAIP-AIOS
7
7
 
8
+ For the isolated SQLite dashboard, also discover and use `$zaip-skill-sqlite-read-model`.
9
+ The setup must verify Node.js 22+, install the LTS release with `winget` when the user has
10
+ authorized automatic prerequisite installation, and create the disposable database only from
11
+ canonical `.agents/records` and `.agents/config` sources.
12
+
8
13
  1. Faça dry-run, descubra a versão/layout e rejeite conflitos de checksum, ownership ou arquivos divergentes do usuário.
9
14
  2. Instale/valide `config/project.yaml`, `config/framework.lock.yaml`, as cinco Rules core diretamente em `rules/`, as Rules locais fora do lock preservadas, todos os Requirements/skills gerenciados pelo manifest, as raízes V2 de `data` e o dashboard frontend-only em `.agents/dashboard` quando ele fizer parte da distribuição.
10
15
  3. Nunca mantenha lista fixa da quantidade de Requirements ou skills no workflow; derive o catálogo do release/lock vigente.