@zaip-ai/cli 3.8.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/README.md +5 -5
  2. package/dist/services/adapters.d.ts +1 -1
  3. package/dist/services/adapters.js +1 -1
  4. package/dist/services/agent-adapters.js +1 -1
  5. package/dist/services/agent-adapters.js.map +1 -1
  6. package/dist/services/backup-gitignore.d.ts +9 -0
  7. package/dist/services/backup-gitignore.d.ts.map +1 -0
  8. package/dist/services/backup-gitignore.js +66 -0
  9. package/dist/services/backup-gitignore.js.map +1 -0
  10. package/dist/services/backup-gitignore.test.d.ts +2 -0
  11. package/dist/services/backup-gitignore.test.d.ts.map +1 -0
  12. package/dist/services/backup-gitignore.test.js +27 -0
  13. package/dist/services/backup-gitignore.test.js.map +1 -0
  14. package/dist/services/codex-conversation-lifecycle-hook.d.ts.map +1 -1
  15. package/dist/services/codex-conversation-lifecycle-hook.js +15 -7
  16. package/dist/services/codex-conversation-lifecycle-hook.js.map +1 -1
  17. package/dist/services/install-agents-template.d.ts.map +1 -1
  18. package/dist/services/install-agents-template.js +43 -127
  19. package/dist/services/install-agents-template.js.map +1 -1
  20. package/dist/services/install-template-policy.d.ts.map +1 -1
  21. package/dist/services/install-template-policy.js +2 -0
  22. package/dist/services/install-template-policy.js.map +1 -1
  23. package/dist/services/legacy-records-migration.d.ts +15 -0
  24. package/dist/services/legacy-records-migration.d.ts.map +1 -0
  25. package/dist/services/legacy-records-migration.js +109 -0
  26. package/dist/services/legacy-records-migration.js.map +1 -0
  27. package/dist/services/local-state-migration.d.ts +8 -1
  28. package/dist/services/local-state-migration.d.ts.map +1 -1
  29. package/dist/services/local-state-migration.js +67 -32
  30. package/dist/services/local-state-migration.js.map +1 -1
  31. package/dist/services/logger.d.ts.map +1 -1
  32. package/dist/services/logger.js +2 -0
  33. package/dist/services/logger.js.map +1 -1
  34. package/dist/services/project-model-migration.d.ts +3 -0
  35. package/dist/services/project-model-migration.d.ts.map +1 -0
  36. package/dist/services/project-model-migration.js +163 -0
  37. package/dist/services/project-model-migration.js.map +1 -0
  38. package/dist/services/project-model-migration.test.d.ts +2 -0
  39. package/dist/services/project-model-migration.test.d.ts.map +1 -0
  40. package/dist/services/project-model-migration.test.js +62 -0
  41. package/dist/services/project-model-migration.test.js.map +1 -0
  42. package/dist/services/template-manifest.d.ts.map +1 -1
  43. package/dist/services/template-manifest.js +2 -0
  44. package/dist/services/template-manifest.js.map +1 -1
  45. package/dist/services/transactional-files.d.ts +1 -0
  46. package/dist/services/transactional-files.d.ts.map +1 -1
  47. package/dist/services/transactional-files.js +3 -0
  48. package/dist/services/transactional-files.js.map +1 -1
  49. package/dist/types.d.ts +1 -0
  50. package/dist/types.d.ts.map +1 -1
  51. package/package.json +1 -1
  52. package/templates/.agents/README-ENG.md +88 -32
  53. package/templates/.agents/README.md +57 -30
  54. package/templates/.agents/config/agents/discovery.json +1 -1
  55. package/templates/.agents/config/clients/codex/agents/zaip-agent-orchestrator.toml +1 -1
  56. package/templates/.agents/config/project.yaml +21 -7
  57. package/templates/.agents/dashboard/.zaip-managed.json +184 -112
  58. package/templates/.agents/dashboard/apps/frontend/dist/assets/{CostCalculationGuidePage-D2PL4UOu.js → CostCalculationGuidePage-f4ZGJRg3.js} +1 -1
  59. package/templates/.agents/dashboard/apps/frontend/dist/assets/{DashboardHelpDialog-CocoP9CA.js → DashboardHelpDialog-DlN5EMmD.js} +238 -124
  60. package/templates/.agents/dashboard/apps/frontend/dist/assets/{PricingSettingsDialog-D255_hNf.js → PricingSettingsDialog-v9zGRTlk.js} +1 -1
  61. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-BRdoeTWk.js +3 -0
  62. package/templates/.agents/dashboard/apps/frontend/dist/assets/{TraceabilityWorkspace-BTFSLQ69.js → TraceabilityWorkspace-B_5u4Xnp.js} +1 -1
  63. package/templates/.agents/dashboard/apps/frontend/dist/assets/{cost-monitor-BsMfGfQi.css → cost-monitor-C2AFYBu_.css} +1 -1
  64. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-D7PrDZy9.js +68 -0
  65. package/templates/.agents/dashboard/apps/frontend/dist/assets/{dashboard-localization-058lag33.js → dashboard-localization-CF7B1Hjn.js} +88 -32
  66. package/templates/.agents/dashboard/apps/frontend/dist/assets/{icons-vendor-DeFPiN32.js → icons-vendor-Cv3WBFIF.js} +1 -1
  67. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-C4rLXrz_.js +2 -0
  68. package/templates/.agents/dashboard/apps/frontend/dist/assets/{react-vendor-BIWcbEAc.js → react-vendor-mHgsmxb6.js} +1 -1
  69. package/templates/.agents/dashboard/apps/frontend/dist/assets/{traceability-fZZL0ohD.js → traceability-B0CPyEVq.js} +1 -1
  70. package/templates/.agents/dashboard/apps/frontend/dist/index.html +6 -6
  71. package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
  72. package/templates/.agents/dashboard/apps/frontend/src/AppDashboardContent.tsx +11 -1
  73. package/templates/.agents/dashboard/apps/frontend/src/AppLoadingBoundary.tsx +3 -2
  74. package/templates/.agents/dashboard/apps/frontend/src/AppLoadingPanels.tsx +1 -1
  75. package/templates/.agents/dashboard/apps/frontend/src/AppOverlays.tsx +1 -1
  76. package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.tsx +9 -13
  77. package/templates/.agents/dashboard/apps/frontend/src/cost-monitor-population.test.tsx +4 -2
  78. package/templates/.agents/dashboard/apps/frontend/src/cost-period-refresh.test.ts +9 -5
  79. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api-settings.ts +3 -2
  80. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.test.ts +2 -2
  81. package/templates/.agents/dashboard/apps/frontend/src/dashboard-identity.test.ts +3 -3
  82. package/templates/.agents/dashboard/apps/frontend/src/dashboard-identity.ts +1 -1
  83. package/templates/.agents/dashboard/apps/frontend/src/dashboard-localization.test.ts +2 -1
  84. package/templates/.agents/dashboard/apps/frontend/src/operations-period-render.test.ts +40 -3
  85. package/templates/.agents/dashboard/apps/frontend/src/project-settings-model.ts +12 -1
  86. package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +19 -0
  87. package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +1 -1
  88. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.test.ts +3 -1
  89. package/templates/.agents/dashboard/apps/frontend/src/use-dashboard-app-model.tsx +14 -23
  90. package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
  91. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.test.ts +3 -3
  92. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.tsx +2 -3
  93. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostDeveloperAttributionTable.tsx +2 -6
  94. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostGroupsTable.period-values.test.tsx +66 -0
  95. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostGroupsTable.tsx +29 -34
  96. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.embedded.test.ts +11 -0
  97. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +1 -13
  98. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostPeriodAverageCards.test.tsx +23 -0
  99. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostPeriodAverageCards.tsx +2 -1
  100. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTableDisplay.ts +6 -11
  101. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables-keeps-legacy-codex-identity-fields-blank.test.ts +6 -6
  102. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.test.ts +10 -12
  103. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-group-page-totals.ts +23 -0
  104. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-group-period-values.tsx +34 -0
  105. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor-embedded.css +0 -7
  106. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-table-formatters.ts +4 -9
  107. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-table-presentation.ts +2 -3
  108. package/templates/.agents/dashboard/modules/operations/package.json +1 -1
  109. package/templates/.agents/dashboard/modules/operations/src/react/DeveloperAttributionPanel.tsx +2 -12
  110. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.helpers.tsx +2 -2
  111. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.test.ts +1 -6
  112. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.tsx +34 -36
  113. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverviewCharts.tsx +12 -3
  114. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverviewTopPanel.tsx +12 -14
  115. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +4 -4
  116. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageOverview.tsx +23 -4
  117. package/templates/.agents/dashboard/modules/operations/src/react/OverviewCostKpi.tsx +30 -2
  118. package/templates/.agents/dashboard/modules/operations/src/react/TaskDetailsDialog.tsx +2 -13
  119. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkBoard.priority.test.ts +8 -1
  120. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkBoard.tsx +8 -16
  121. package/templates/.agents/dashboard/modules/operations/src/react/WorkColumnState.tsx +34 -0
  122. package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.test.ts +1 -1
  123. package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.ts +1 -1
  124. package/templates/.agents/dashboard/modules/operations/src/react/operations-average-unmeasured.test.ts +10 -0
  125. package/templates/.agents/dashboard/modules/operations/src/react/operations-content-visibility.ts +3 -0
  126. package/templates/.agents/dashboard/modules/operations/src/react/operations-coverage-toast.test.ts +4 -3
  127. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview-period-filter.test.ts +12 -1
  128. package/templates/.agents/dashboard/modules/operations/src/react/operations-page-contract.ts +1 -0
  129. package/templates/.agents/dashboard/modules/operations/src/react/operations-skeleton.css +80 -0
  130. package/templates/.agents/dashboard/modules/operations/src/react/operations.css +2 -11
  131. package/templates/.agents/dashboard/modules/operations/src/react/overview-cost-card.test.tsx +36 -0
  132. package/templates/.agents/dashboard/modules/operations/src/react/overview-metric-format.test.ts +11 -0
  133. package/templates/.agents/dashboard/modules/operations/src/react/overview-metric-format.ts +28 -3
  134. package/templates/.agents/dashboard/modules/operations/src/react/overview-metric-stats.ts +44 -0
  135. package/templates/.agents/dashboard/modules/operations/src/react/work-card-label.ts +5 -0
  136. package/templates/.agents/dashboard/modules/operations/src/react/work-column-state.ts +11 -0
  137. package/templates/.agents/dashboard/modules/operations/src/react/work-item-filter.ts +13 -0
  138. package/templates/.agents/dashboard/modules/traceability/package.json +1 -1
  139. package/templates/.agents/dashboard/packages/branding/package.json +1 -1
  140. package/templates/.agents/dashboard/packages/contracts/package.json +1 -1
  141. package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
  142. package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +157 -157
  143. package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +153 -153
  144. package/templates/.agents/dashboard/packages/local-runtime/package.json +1 -1
  145. package/templates/.agents/dashboard/packages/local-runtime/server.mjs +159 -159
  146. package/templates/.agents/dashboard/packages/local-runtime/src/active-codex-telemetry.test.ts +31 -0
  147. package/templates/.agents/dashboard/packages/local-runtime/src/active-codex-telemetry.ts +74 -1
  148. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +1 -1
  149. package/templates/.agents/dashboard/packages/local-runtime/src/server-identity.test.ts +1 -1
  150. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-synchronization.test.ts +25 -3
  151. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot-synchronization.ts +51 -16
  152. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot.test.ts +1 -1
  153. package/templates/.agents/dashboard/packages/local-runtime/src/server-ui-security.ts +37 -0
  154. package/templates/.agents/dashboard/packages/local-runtime/src/server-workspace.ts +1 -1
  155. package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +11 -33
  156. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-rebuild.ts +12 -13
  157. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-source-fingerprint.test.ts +71 -1
  158. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-source-fingerprint.ts +141 -25
  159. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model-worktree-sources.test.ts +60 -0
  160. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-rebuild-fingerprint-options.ts +13 -0
  161. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-launch-page.mjs +26 -2
  162. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard-launch-page.test.mjs +5 -0
  163. package/templates/.agents/dashboard/packages/ui/package.json +1 -1
  164. package/templates/.agents/dashboard/packages/ui/src/DashboardHeader.test.mjs +5 -0
  165. package/templates/.agents/dashboard/packages/ui/src/DashboardHeader.tsx +4 -4
  166. package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
  167. package/templates/.agents/dashboard/tests/e2e/playwright.config.ts +4 -0
  168. package/templates/.agents/dashboard/tests/e2e/specs/dashboard-performance-matrix.spec.ts +4 -4
  169. package/templates/.agents/dashboard/tests/e2e/specs/dashboard.spec.ts +1 -1
  170. package/templates/.agents/dashboard/tests/e2e/specs/performance-work-row-identity.ts +6 -0
  171. package/templates/.agents/design/.zaip-managed.json +13 -9
  172. package/templates/.agents/design/apps/catalog/dist/assets/index-DkpQYoyC.js +72 -0
  173. package/templates/.agents/design/apps/catalog/dist/index.html +1 -1
  174. package/templates/.agents/design/apps/catalog/package.json +1 -1
  175. package/templates/.agents/design/apps/catalog/src/components/CostPopulationSpecimen.test.tsx +8 -4
  176. package/templates/.agents/design/apps/catalog/src/components/CostPopulationSpecimen.tsx +10 -3
  177. package/templates/.agents/design/apps/catalog/src/components/DashboardFiltersSpecimen.tsx +0 -15
  178. package/templates/.agents/design/apps/catalog/src/pages/ComponentsPage.tsx +3 -3
  179. package/templates/.agents/design/apps/catalog/src/stories/DashboardFilters.stories.tsx +0 -1
  180. package/templates/.agents/design/packages/local-runtime/package.json +1 -1
  181. package/templates/.agents/requirements/autonomous-assurance.md +1 -1
  182. package/templates/.agents/requirements/cloud-hostinger-autonomy.md +1 -1
  183. package/templates/.agents/requirements/comparative-audit.md +1 -1
  184. package/templates/.agents/requirements/context-engine.md +1 -1
  185. package/templates/.agents/requirements/cost-observability.md +1 -1
  186. package/templates/.agents/requirements/dashboard-launch.md +1 -1
  187. package/templates/.agents/requirements/data-export.md +1 -1
  188. package/templates/.agents/requirements/design-system.md +1 -1
  189. package/templates/.agents/requirements/execution-engine.md +1 -1
  190. package/templates/.agents/requirements/kanban-dashboard.md +1 -1
  191. package/templates/.agents/requirements/model-orchestration.md +1 -1
  192. package/templates/.agents/requirements/public-distribution.md +1 -1
  193. package/templates/.agents/requirements/software-architecture.md +1 -1
  194. package/templates/.agents/requirements/strategic-improvements.md +1 -1
  195. package/templates/.agents/requirements/work-lifecycle.md +1 -1
  196. package/templates/.agents/requirements/zaip-strategic-95.md +1 -1
  197. package/templates/.agents/rules/autonomy-decision.md +2 -2
  198. package/templates/.agents/rules/workflow.md +1 -1
  199. package/templates/.agents/runtime/VERSION +1 -1
  200. package/templates/.agents/runtime/bin/zaip.mjs +48 -39
  201. package/templates/.agents/runtime/checksums.sha256 +5 -5
  202. package/templates/.agents/runtime/manifest.json +1 -1
  203. package/templates/.agents/runtime/provenance.json +4 -4
  204. package/templates/.agents/runtime/sbom.cdx.json +1 -1
  205. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/SKILL.md +7 -7
  206. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/ready-queue-fence.mjs +32 -7
  207. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/ready-queue-fence.test.mjs +134 -1
  208. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/ready-queue-lease.mjs +57 -0
  209. package/templates/.agents/skills/zaip-skill-executar-fila-pronta/scripts/scheduled-ready-queue-contract.test.mjs +9 -6
  210. package/templates/.agents/skills/zaip-skill-execution/SKILL.md +1 -1
  211. package/templates/.agents/skills/zaip-skill-execution/references/runtime-governance.md +2 -2
  212. package/templates/.agents/skills/zaip-skill-github-deploy/scripts/github-deploy-contract.test.mjs +18 -6
  213. package/templates/.agents/skills/zaip-skill-instalar-agendamento/SKILL.md +2 -2
  214. package/templates/.agents/skills/zaip-skill-release-qualification/SKILL.md +6 -0
  215. package/templates/.agents/skills/zaip-skill-release-qualification/references/local-preparation.md +47 -5
  216. package/templates/.agents/zaip-aios/README.md +4 -4
  217. package/templates/.agents/zaip-aios/VERSION +1 -1
  218. package/templates/.agents/zaip-aios/guides/01-primeiros-passos.md +4 -3
  219. package/templates/.agents/zaip-aios/guides/03-tasks.md +5 -4
  220. package/templates/.agents/zaip-aios/guides/04-specs.md +4 -1
  221. package/templates/.agents/zaip-aios/guides/05-prds.md +7 -3
  222. package/templates/.agents/zaip-aios/guides/06-execucao.md +9 -4
  223. package/templates/.agents/zaip-aios/guides/09-agentes-e-squads.md +9 -5
  224. package/templates/.agents/zaip-aios/guides/11-observabilidade-e-custos.md +10 -2
  225. package/templates/.agents/zaip-aios/guides/12-instalacao-e-upgrade.md +10 -5
  226. package/templates/.agents/zaip-aios/guides/13-boas-praticas.md +12 -1
  227. package/templates/.agents/zaip-aios/guides/14-troubleshooting.md +3 -1
  228. package/templates/.agents/zaip-aios/guides/16-lifecycle-e-reconciliacao.md +12 -7
  229. package/templates/.agents/zaip-aios/guides/17-como-o-custo-e-calculado.md +1 -1
  230. package/templates/.agents/zaip-aios/guides/18-catalogo-de-agentes.md +4 -0
  231. package/templates/.agents/zaip-aios/guides/19-assurance-e-autonomia.md +19 -15
  232. package/templates/.agents/zaip-aios/guides/20-instalacao-detalhada.md +12 -8
  233. package/templates/.agents/zaip-aios/guides/21-telemetria-monitor-custos.md +4 -3
  234. package/templates/.agents/zaip-aios/guides/22-fluxos-e-roteamento.md +9 -7
  235. package/templates/.agents/zaip-aios/guides/23-orquestracao-de-modelos.md +38 -22
  236. package/templates/.agents/zaip-aios/guides/24-calculo-de-custos-openai.md +1 -1
  237. package/templates/.agents/zaip-aios/guides/26-qualidade-e-release.md +14 -5
  238. package/templates/.agents/zaip-aios/guides/27-telemetria-git-native.md +6 -0
  239. package/templates/.agents/zaip-aios/guides/28-lifecycle-completo.md +129 -11
  240. package/templates/template-manifest.json +270 -186
  241. package/templates/tsconfig.base.json +22 -0
  242. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-0f_x2TzJ.js +0 -3
  243. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-zhY2JoLc.js +0 -68
  244. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-Dh95Yodm.js +0 -2
@@ -1,11 +1,11 @@
1
1
  b146bd0c7c60b1ab43c4f71e0b1d2262c6df6da6f7053a0425f834ccb77a6b48 LICENSE
2
2
  bc02cba77e8d51e5c580f43668863dc868eda66f1ff663bfaa49fcf3ca16320e THIRD_PARTY_NOTICES.md
3
- 88206afd2d9b56ca71466c85d1ed1421b1db0e78fa00072697918fb8a9ac54ef VERSION
4
- b9d0c02583775ea664f7bb92d73c4c901194d4a9bbd3a49993b4891ed241b6ef bin/zaip.mjs
5
- d6ef4cfccc2b5d66289f37da8e3f8c726d2c6f5fe8f93e65b0e1f7df7c9b450d manifest.json
3
+ e1d49c569ae09b2ede16e2d83820a3809b35eb6c44c13ba9b5330598d6b8f43c VERSION
4
+ 239d00f5ff145dfddbdaee66fa94a286e3e80228bfec8f67919ea6f9099b16a0 bin/zaip.mjs
5
+ 57c1b270eed2ecf577dd3e0d13a951380aa96a5a4b5a7adf396f31a1df777e96 manifest.json
6
6
  7f89219d7c567c82a51679ad136d84364bded7ac659492537e125d33b1d58a7a migrations/001-layout-v1.json
7
7
  5f8c48b286d0b44d8fbb57a9a5d009a8a500439aa3148d750b8f193f72995c9f migrations/002-layout-v2.json
8
8
  33c98d5dc506bba4b8b3ca612706d9eb05ef13d9e03c33a4f9e65ca7804be9d1 pnpm-lock.sha256
9
- 15a8ac0676b794bf453eb54f027b30c0ca7cc5e7e572c591a5d76dee6efd1ed3 provenance.json
10
- 017f220c51e33ecccbcbeb58a5673b990b67c37b44a5e6761f02be8c9219a761 sbom.cdx.json
9
+ 54fc0f67af77dba2941ab13c90eb77afcd61f3ec62b28c2c6a07961c79e540ff provenance.json
10
+ 9bf5a95c277816679d424ff2fb9a99f2e41b4a32c442c95159c314e3c4efe04f sbom.cdx.json
11
11
  b3ffedf9e146be802a15b4009f33e031dec3071ca1525e12c67606fd964a3067 schemas/contracts.schema.json
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
3
  "name": "zaip-aios",
4
- "version": "3.8.0",
4
+ "version": "4.0.0",
5
5
  "node": ">=22",
6
6
  "files": [
7
7
  "LICENSE",
@@ -2,10 +2,10 @@
2
2
  "schema_version": 1,
3
3
  "statement_type": "self_reported_build_integrity",
4
4
  "authenticity": "unverified",
5
- "version": "3.8.0",
5
+ "version": "4.0.0",
6
6
  "source_origin": "zaip-aios:local-build",
7
7
  "lockfile_sha256": "03d08e5bbb198d74014ea4a806fcdeb350db23ec2bf0c2886a2265066555d418",
8
- "sbom_sha256": "017f220c51e33ecccbcbeb58a5673b990b67c37b44a5e6761f02be8c9219a761",
9
- "runtime_sha256": "ce933ca820e864c27fb8fc33c873ef94504cf2015e14cdd8709b6b9e72370bb9",
10
- "statement_sha256": "a6b24e3dacdca76511477e9f77a8d83281159cf73d96257b962c6677009f80dd"
8
+ "sbom_sha256": "9bf5a95c277816679d424ff2fb9a99f2e41b4a32c442c95159c314e3c4efe04f",
9
+ "runtime_sha256": "3f08dd1f60c42934f982cf368df0610f852a96b19123c8771e85e92cccd24e6e",
10
+ "statement_sha256": "9c05251add6c72fd1fe61d5353ba239bc693e95a80a03d0389a38b1e6e6f413b"
11
11
  }
@@ -6,7 +6,7 @@
6
6
  "component": {
7
7
  "type": "application",
8
8
  "name": "zaip-aios",
9
- "version": "3.8.0"
9
+ "version": "4.0.0"
10
10
  }
11
11
  },
12
12
  "components": [
@@ -1,18 +1,18 @@
1
1
  ---
2
2
  name: zaip-skill-executar-fila-pronta
3
- description: Execute the full eligible ready-work snapshot using the canonical queue order.
3
+ description: Execute one eligible top-level ready item per scheduled Codex invocation.
4
4
  ---
5
5
 
6
6
  # Executar fila pronta
7
7
 
8
- Use esta skill para uma rodada idempotente que processa sequencialmente o snapshot elegível da fila. A seleção é estrita: PRD `ready`, depois SPEC `ready` independente, depois Task-first standalone elegível em `Pronto para Executar`.
8
+ Use esta skill para uma rodada idempotente que reivindica e executa **um único item superior** da fila. A seleção é estrita: PRD `ready`, depois SPEC `ready` independente, depois Task-first standalone elegível em `Pronto para Executar`. Uma rodada jamais inicia um segundo item, mesmo quando o primeiro termina rapidamente, falha ou é pulado por disputa.
9
9
 
10
10
  1. A primeira ação da conversa agendada chama `codex_app set_thread_title` sem `threadId`, usando a hora local `America/Sao_Paulo` no formato exato `[YYYY-MM-DD-T-HH-mm] Tarefa Agendada`. Registre a falha de renomeação observada e continue para a fila; ela não bloqueia a rodada.
11
11
  2. Valide o checkout local, `zaip.enabled: true`, registros canônicos e runtime. Leia `.agents/dashboard/work-priority.json` quando existir; ausência ou conteúdo inválido equivale a nenhuma prioridade manual, nunca a uma ordem inventada.
12
- 3. Antes de selecionar, crie atomicamente `.local/automation/ready-queue.lock.json` (diretório local não versionado) com `owner_token` aleatório, `fencing_token`, `acquired_at` e `expires_at`. O `fencing_token` é um inteiro monotônico: toda aquisição que substitui um lock expirado recebe valor maior que o último valor observado. Se existir lock válido de outra rodada, retorne sem efeito; nunca force a sobreposição. Renove o mesmo lock, com token e `owner_token` conferidos, antes de cada candidato. Antes de cada efeito (incluindo iniciar uma Execution), releia o lock e exija ambos os tokens atuais e prazo válido; se a renovação falhar ou o token não for atual, encerre a rodada sem executar mais efeitos. Libere somente ao terminar e apenas se o `owner_token` ainda corresponder; locks expirados podem ser substituídos atomicamente.
13
- 4. Forme os candidatos nesta precedência: (a) PRDs `ready`; (b) SPECs `ready` que não descendem de PRD; (c) Tasks Task-first standalone `prepared`/`planned`, com dependências concluídas e exatamente um PreparedPlan resolvível: `prepared_plan` inline válido **ou** `plan_ref` válido, nunca ambos. A Task ainda não pode ter Execution vinculada e nunca pode ter sido iniciada ou tentada. Para cada candidata, exclua o registro sem `status: planned`, com `started_at`, `attempt_count` diferente de zero, Execution existente, estado de plano ambíguo, ou cujo próprio ID apareça em `task next` ou no conjunto materializado concorrente. Exclua também descendentes de PRD/SPEC e itens `active`, `blocked`, `failed`, `cancelled` ou terminais.
14
- 5. Ordene cada classe por `.agents/dashboard/work-priority.json`: itens enumerados no Kanban vêm primeiro e mantêm a ordem de cima para baixo; os sem enumeração entram depois pelo fallback canônico determinístico. Congele o snapshot ordenado e processe todos os PRDs antes de SPECs, e todos os SPECs antes das Tasks; não misture classes.
15
- 6. Execute cada unidade do snapshot, uma por vez, pelo comando explícito no menor grão (`prd execute`, `spec execute` ou `task execute`). Para uma Task-first elegível, use `task execute` para materializar sua Execution; não crie a Execution por outro atalho. Reavalie o estado antes de cada início e pule o item que deixou de ser elegível. Preserve os gates de write scope, dependências, evidências, testes e finalizador; uma seleção não é autorização para ignorar qualquer gate.
16
- 7. Registre o resultado de cada unidade, as omissões e a ausência de candidatos, e solte o lease. Sem candidato, retorne `no_eligible_work`; com precondição ausente, conflito de lease ou estado ambíguo, falhe fechado e não altere registros.
12
+ 3. Antes de selecionar, chame `node .agents/skills/zaip-skill-executar-fila-pronta/scripts/ready-queue-lease.mjs acquire` na raiz do projeto. Ele cria atomicamente `.local/automation/ready-queue.lock.json` (diretório local não versionado) com `owner_token` aleatório, `fencing_token`, `acquired_at` e `expires_at`. Guarde o `owner_token` e `fencing_token` retornados; não os invente. O `fencing_token` é um inteiro monotônico: toda aquisição que substitui um lock expirado recebe valor maior que o último valor observado. Se existir lock válido de outra rodada, retorne sem efeito; nunca force a sobreposição. Renove o mesmo lock com `ready-queue-lease.mjs renew OWNER FENCE` antes de reivindicar o item selecionado e nos checkpoints de uma execução longa. Antes de cada efeito (incluindo iniciar uma Execution), chame `ready-queue-lease.mjs assert OWNER FENCE` e exija sucesso; se falhar, encerre a rodada sem executar mais efeitos. Libere com `ready-queue-lease.mjs release OWNER FENCE` somente ao terminar e apenas se o `owner_token` ainda corresponder; locks expirados podem ser substituídos atomicamente.
13
+ 4. Consulte `zaip task ready-next --json` para a seleção canônica e determinística: PRD `ready`; depois SPEC `ready` independente; depois Task-first standalone `prepared`/`planned`, com dependências concluídas e exatamente um PreparedPlan resolvível: `prepared_plan` inline válido **ou** `plan_ref` válido, nunca ambos. A Task ainda não pode ter Execution vinculada e nunca pode ter sido iniciada ou tentada. O comando exclui Task sem `status: planned`, com `started_at`, `attempt_count` diferente de zero, Execution existente, estado de plano ambíguo, ou cujo próprio ID apareça em `task next` ou no conjunto materializado concorrente. Exclui também descendentes de PRD/SPEC e itens `active`, `blocked`, `failed`, `cancelled` ou terminais. Falha de leitura/validação não é fila vazia: bloqueie a rodada.
14
+ 5. O seletor usa `.agents/dashboard/work-priority.json`: itens enumerados no Kanban vêm primeiro e mantêm a ordem de cima para baixo; os sem enumeração entram depois por `created_at` e ID. Um arquivo inválido equivale a nenhuma prioridade manual. Considere PRDs antes de SPECs, e SPECs antes de Tasks. Releia `zaip task ready-next --json` sob o lease e reivindique **somente o primeiro item superior elegível** com `ready-queue-lease.mjs claim OWNER FENCE ITEM_ID`. Uma segunda reivindicação de outro ID com o mesmo lease é rejeitada pelo código; não transforme os demais candidatos em execução nesta rodada. Depois do claim, repita `zaip task ready-next --json`: se o item mudou ou ficou inelegível, registre a disputa e não escolha outro.
15
+ 6. Execute somente o item reivindicado, pelo comando explícito no menor grão (`prd execute`, `spec execute` ou `task execute`). Para uma Task-first elegível, use `task execute` para materializar sua Execution; não crie a Execution por outro atalho. Se o item deixar de ser elegível antes do início, registre a disputa e termine a rodada sem selecionar o próximo. Preserve os gates de write scope, dependências, evidências, testes e finalizador; uma seleção não é autorização para ignorar qualquer gate.
16
+ 7. Registre o resultado do único item, a ausência de candidatos ou a disputa observada, e solte o lease. Sem candidato, retorne `no_eligible_work`; com precondição ausente, conflito de lease ou estado ambíguo, falhe fechado e não altere registros.
17
17
 
18
18
  Esta skill não cria um agendamento. Ela só pode ser chamada pela automação nativa do Codex Desktop ou por um usuário com autoridade explícita para executar o trabalho selecionado.
@@ -1,5 +1,6 @@
1
1
  import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
2
2
  import { dirname, resolve } from "node:path";
3
+ import { setTimeout as delay } from "node:timers/promises";
3
4
 
4
5
  export async function acquireReadyQueueFence(lockPath, input) {
5
6
  return withMutex(lockPath, async () => {
@@ -19,11 +20,25 @@ export async function acquireReadyQueueFence(lockPath, input) {
19
20
  export async function renewReadyQueueFence(lockPath, lease, now, expiresAt) {
20
21
  return withMutex(lockPath, async () => {
21
22
  if (!(await assertReadyQueueFence(lockPath, lease, now))) return null;
22
- const renewed = { ...lease, expires_at: expiresAt };
23
+ const renewed = { ...(await readLease(lockPath)), expires_at: expiresAt };
23
24
  await writeLease(lockPath, renewed);
24
25
  return renewed;
25
26
  });
26
27
  }
28
+ /** A scheduled invocation may claim exactly one canonical top-level item. */
29
+ export async function claimReadyQueueItem(lockPath, lease, itemId, now) {
30
+ if (!/^(PRD|SPEC|TASK)-[A-Z0-9-]+$/.test(itemId))
31
+ throw new Error("Ready queue claim requires one canonical item ID");
32
+ return withMutex(lockPath, async () => {
33
+ if (!(await assertReadyQueueFence(lockPath, lease, now))) return null;
34
+ const current = await readLease(lockPath);
35
+ if (current.claimed_item_id !== undefined && current.claimed_item_id !== itemId) return null;
36
+ if (current.claimed_item_id === itemId) return current;
37
+ const claimed = { ...current, claimed_item_id: itemId, claimed_at: now };
38
+ await writeLease(lockPath, claimed);
39
+ return claimed;
40
+ });
41
+ }
27
42
  export async function assertReadyQueueFence(lockPath, lease, now) {
28
43
  const current = await readLease(lockPath);
29
44
  return (
@@ -37,19 +52,29 @@ export async function assertReadyQueueFence(lockPath, lease, now) {
37
52
  export async function releaseReadyQueueFence(lockPath, lease, now) {
38
53
  return withMutex(lockPath, async () => {
39
54
  if (!(await assertReadyQueueFence(lockPath, lease, now))) return false;
40
- await writeLease(lockPath, { ...lease, expires_at: now, released_at: now });
55
+ await writeLease(lockPath, {
56
+ ...(await readLease(lockPath)),
57
+ expires_at: now,
58
+ released_at: now,
59
+ });
41
60
  return true;
42
61
  });
43
62
  }
44
63
  async function withMutex(lockPath, operation) {
45
64
  const mutex = `${lockPath}.mutex`;
46
65
  await mkdir(dirname(lockPath), { recursive: true });
47
- try {
48
- await mkdir(mutex);
49
- } catch (error) {
50
- if (error?.code === "EEXIST") return null;
51
- throw error;
66
+ let acquired = false;
67
+ for (let attempt = 0; attempt < 25; attempt += 1) {
68
+ try {
69
+ await mkdir(mutex);
70
+ acquired = true;
71
+ break;
72
+ } catch (error) {
73
+ if (error?.code !== "EEXIST") throw error;
74
+ if (attempt < 24) await delay(40);
75
+ }
52
76
  }
77
+ if (!acquired) throw new Error(`Ready queue mutex remains held: ${mutex}`);
53
78
  try {
54
79
  return await operation();
55
80
  } finally {
@@ -1,11 +1,13 @@
1
1
  import assert from "node:assert/strict";
2
- import { mkdtemp, rm } from "node:fs/promises";
2
+ import { execFileSync } from "node:child_process";
3
+ import { mkdir, mkdtemp, rm, stat, writeFile } from "node:fs/promises";
3
4
  import { tmpdir } from "node:os";
4
5
  import { join } from "node:path";
5
6
  import test from "node:test";
6
7
  import {
7
8
  acquireReadyQueueFence,
8
9
  assertReadyQueueFence,
10
+ claimReadyQueueItem,
9
11
  releaseReadyQueueFence,
10
12
  renewReadyQueueFence,
11
13
  } from "./ready-queue-fence.mjs";
@@ -58,3 +60,134 @@ test("fence is exclusive, monotonic, and rejects a stale owner", async () => {
58
60
  await rm(directory, { recursive: true, force: true });
59
61
  }
60
62
  });
63
+
64
+ test("Windows-compatible lease command allows only one claimed item", async () => {
65
+ const directory = await mkdtemp(join(tmpdir(), "zaip-ready-cli-"));
66
+ const script = join(import.meta.dirname, "ready-queue-lease.mjs");
67
+ const call = (...args) =>
68
+ JSON.parse(
69
+ execFileSync(process.execPath, [script, ...args], { cwd: directory, encoding: "utf8" }),
70
+ );
71
+ try {
72
+ await mkdir(join(directory, ".agents", "config"), { recursive: true });
73
+ await writeFile(
74
+ join(directory, ".agents", "config", "project.yaml"),
75
+ "zaip:\n enabled: true\n",
76
+ );
77
+ const lease = call("acquire").result;
78
+ assert.equal(
79
+ call("claim", lease.owner_token, String(lease.fencing_token), "TASK-2026-09-24-READY-AAAA")
80
+ .result.claimed_item_id,
81
+ "TASK-2026-09-24-READY-AAAA",
82
+ );
83
+ assert.equal(
84
+ call("renew", lease.owner_token, String(lease.fencing_token)).result.claimed_item_id,
85
+ "TASK-2026-09-24-READY-AAAA",
86
+ );
87
+ assert.throws(
88
+ () =>
89
+ call("claim", lease.owner_token, String(lease.fencing_token), "TASK-2026-09-24-READY-BBBB"),
90
+ /Command failed/,
91
+ );
92
+ assert.equal(call("release", lease.owner_token, String(lease.fencing_token)).ok, true);
93
+ } finally {
94
+ await rm(directory, { recursive: true, force: true });
95
+ }
96
+ });
97
+
98
+ test("one lease cannot claim a second ready item, including after renewal", async () => {
99
+ const directory = await mkdtemp(join(tmpdir(), "zaip-ready-single-"));
100
+ const lock = join(directory, "ready-queue.lock.json");
101
+ try {
102
+ const lease = await acquireReadyQueueFence(lock, {
103
+ owner_token: "owner-a",
104
+ now: "2026-09-24T12:00:00.000Z",
105
+ expires_at: "2026-09-24T12:01:00.000Z",
106
+ });
107
+ const claimed = await claimReadyQueueItem(
108
+ lock,
109
+ lease,
110
+ "PRD-2026-09-24-READY-AAAA",
111
+ "2026-09-24T12:00:01.000Z",
112
+ );
113
+ assert.equal(claimed.claimed_item_id, "PRD-2026-09-24-READY-AAAA");
114
+ const renewed = await renewReadyQueueFence(
115
+ lock,
116
+ lease,
117
+ "2026-09-24T12:00:02.000Z",
118
+ "2026-09-24T12:02:00.000Z",
119
+ );
120
+ assert.equal(renewed.claimed_item_id, "PRD-2026-09-24-READY-AAAA");
121
+ assert.equal(
122
+ await claimReadyQueueItem(
123
+ lock,
124
+ renewed,
125
+ "SPEC-2026-09-24-READY-BBBB",
126
+ "2026-09-24T12:00:03.000Z",
127
+ ),
128
+ null,
129
+ );
130
+ assert.equal(
131
+ (
132
+ await claimReadyQueueItem(
133
+ lock,
134
+ lease,
135
+ "PRD-2026-09-24-READY-AAAA",
136
+ "2026-09-24T12:00:04.000Z",
137
+ )
138
+ ).claimed_item_id,
139
+ "PRD-2026-09-24-READY-AAAA",
140
+ );
141
+ assert.equal(await releaseReadyQueueFence(lock, lease, "2026-09-24T12:00:05.000Z"), true);
142
+ assert.equal(
143
+ await claimReadyQueueItem(
144
+ lock,
145
+ lease,
146
+ "PRD-2026-09-24-READY-AAAA",
147
+ "2026-09-24T12:00:06.000Z",
148
+ ),
149
+ null,
150
+ );
151
+ } finally {
152
+ await rm(directory, { recursive: true, force: true });
153
+ }
154
+ });
155
+
156
+ test("transient mutex contention waits instead of pretending the queue is locked", async () => {
157
+ const directory = await mkdtemp(join(tmpdir(), "zaip-ready-contention-"));
158
+ const lock = join(directory, "ready-queue.lock.json");
159
+ const mutex = `${lock}.mutex`;
160
+ try {
161
+ await mkdir(mutex);
162
+ const pending = acquireReadyQueueFence(lock, {
163
+ owner_token: "owner-a",
164
+ now: "2026-09-24T12:00:00.000Z",
165
+ expires_at: "2026-09-24T12:01:00.000Z",
166
+ });
167
+ await new Promise((resolve) => setTimeout(resolve, 80));
168
+ await rm(mutex, { recursive: true });
169
+ assert.equal((await pending)?.owner_token, "owner-a");
170
+ } finally {
171
+ await rm(directory, { recursive: true, force: true });
172
+ }
173
+ });
174
+
175
+ test("orphaned mutex fails visibly without deleting another owner's lock", async () => {
176
+ const directory = await mkdtemp(join(tmpdir(), "zaip-ready-orphan-"));
177
+ const lock = join(directory, "ready-queue.lock.json");
178
+ const mutex = `${lock}.mutex`;
179
+ try {
180
+ await mkdir(mutex);
181
+ await assert.rejects(
182
+ acquireReadyQueueFence(lock, {
183
+ owner_token: "owner-a",
184
+ now: "2026-09-24T12:00:00.000Z",
185
+ expires_at: "2026-09-24T12:01:00.000Z",
186
+ }),
187
+ /mutex remains held/,
188
+ );
189
+ assert.equal((await stat(mutex)).isDirectory(), true);
190
+ } finally {
191
+ await rm(directory, { recursive: true, force: true });
192
+ }
193
+ });
@@ -0,0 +1,57 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { readFile } from "node:fs/promises";
3
+ import { resolve } from "node:path";
4
+ import {
5
+ acquireReadyQueueFence,
6
+ assertReadyQueueFence,
7
+ claimReadyQueueItem,
8
+ releaseReadyQueueFence,
9
+ renewReadyQueueFence,
10
+ } from "./ready-queue-fence.mjs";
11
+
12
+ const root = process.cwd();
13
+ const lockPath = resolve(root, ".local/automation/ready-queue.lock.json");
14
+ const [action, ...args] = process.argv.slice(2);
15
+ const now = new Date().toISOString();
16
+ const expiry = new Date(Date.now() + 4 * 60 * 60 * 1000).toISOString();
17
+
18
+ try {
19
+ const config = await readFile(resolve(root, ".agents/config/project.yaml"), "utf8");
20
+ if (!/^zaip:\s*\r?\n\s+enabled: true\s*$/m.test(config)) {
21
+ throw new Error("ZAIP must be enabled in this checkout");
22
+ }
23
+ let result;
24
+ if (action === "acquire" && args.length === 0) {
25
+ result = await acquireReadyQueueFence(lockPath, {
26
+ owner_token: randomUUID(),
27
+ now,
28
+ expires_at: expiry,
29
+ });
30
+ } else if (["claim", "renew", "assert", "release"].includes(action)) {
31
+ const [owner, rawFence, itemId] = args;
32
+ if (!owner || !/^[1-9]\d*$/.test(rawFence ?? "")) {
33
+ throw new Error("owner_token and positive fencing_token are required");
34
+ }
35
+ const lease = { owner_token: owner, fencing_token: Number(rawFence) };
36
+ if (action === "claim" && args.length === 3) {
37
+ result = await claimReadyQueueItem(lockPath, lease, itemId, now);
38
+ } else if (action === "renew" && args.length === 2) {
39
+ result = await renewReadyQueueFence(lockPath, lease, now, expiry);
40
+ } else if (action === "assert" && args.length === 2) {
41
+ result = await assertReadyQueueFence(lockPath, lease, now);
42
+ } else if (action === "release" && args.length === 2) {
43
+ result = await releaseReadyQueueFence(lockPath, lease, now);
44
+ } else {
45
+ throw new Error("Invalid ready-queue lease arguments");
46
+ }
47
+ } else {
48
+ throw new Error(
49
+ "Usage: ready-queue-lease.mjs acquire|claim OWNER FENCE ITEM|renew OWNER FENCE|assert OWNER FENCE|release OWNER FENCE",
50
+ );
51
+ }
52
+ process.stdout.write(`${JSON.stringify({ ok: result !== null && result !== false, result })}\n`);
53
+ if (result === null || result === false) process.exitCode = 2;
54
+ } catch (error) {
55
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
56
+ process.exitCode = 1;
57
+ }
@@ -7,7 +7,7 @@ const root = resolve(import.meta.dirname, "../..");
7
7
  const read = (path) => readFile(resolve(root, path), "utf8");
8
8
  const repositoryReadme = resolve(root, "../../README.md");
9
9
 
10
- test("hourly ready queue contracts the native Codex scheduler and full ordered snapshot", async () => {
10
+ test("hourly ready queue contracts the native Codex scheduler and one ordered item", async () => {
11
11
  const [installer, executor] = await Promise.all([
12
12
  read("zaip-skill-instalar-agendamento/SKILL.md"),
13
13
  read("zaip-skill-executar-fila-pronta/SKILL.md"),
@@ -35,7 +35,7 @@ test("hourly ready queue contracts the native Codex scheduler and full ordered s
35
35
  assert.match(installer, /standalone/);
36
36
  assert.match(installer, /sem duplicar/);
37
37
  assert.match(installer, /Nunca use o Agendador do Windows/);
38
- assert.match(installer, /authorizes only canonically ready\/eligible items/);
38
+ assert.match(installer, /execute at most one top-level eligible item/);
39
39
  assert.match(installer, /a cada hora, no minuto 0/);
40
40
  assert.match(installer, /nova conversa/);
41
41
  assert.match(installer, /\.agents\/dashboard\/work-priority\.json/);
@@ -44,9 +44,12 @@ test("hourly ready queue contracts the native Codex scheduler and full ordered s
44
44
  assert.match(installer, /set_thread_title without threadId/);
45
45
  assert.match(installer, /\[YYYY-MM-DD-T-HH-mm\] Tarefa Agendada/);
46
46
 
47
- assert.match(executor, /snapshot elegível/);
48
- assert.match(executor, /todos os PRDs antes de SPECs, e todos os SPECs antes das Tasks/);
49
- assert.match(executor, /descendem de PRD/);
47
+ assert.match(executor, /um único item superior/);
48
+ assert.match(executor, /zaip task ready-next --json/);
49
+ assert.match(executor, /somente o primeiro item superior elegível/);
50
+ assert.match(executor, /sem selecionar o próximo/);
51
+ assert.doesNotMatch(executor, /processe todos os PRDs/);
52
+ assert.match(executor, /descendentes de PRD\/SPEC/);
50
53
  assert.match(executor, /`active`, `blocked`, `failed`, `cancelled` ou terminais/);
51
54
  assert.match(executor, /\.agents\/dashboard\/work-priority\.json/);
52
55
  assert.match(executor, /\.local\/automation\/ready-queue\.lock\.json/);
@@ -64,7 +67,7 @@ test("hourly ready queue contracts the native Codex scheduler and full ordered s
64
67
  assert.match(executor, /`prepared_plan` inline válido \*\*ou\*\* `plan_ref` válido, nunca ambos/);
65
68
  assert.match(executor, /não pode ter Execution vinculada/);
66
69
  assert.match(executor, /nunca pode ter sido iniciada ou tentada/);
67
- assert.match(executor, /Para cada candidata/);
70
+ assert.match(executor, /Falha de leitura\/validação não é fila vazia/);
68
71
  assert.match(
69
72
  executor,
70
73
  /cujo próprio ID apareça em `task next` ou no conjunto materializado concorrente/,
@@ -71,7 +71,7 @@ Antes de encerrar com trabalho pendente ou responder a uma falha, aplique [conti
71
71
 
72
72
  ## Runtime gerenciado e compatibilidade
73
73
 
74
- 1. Leia `execution.runtime`. Novo padrão `managed` despacha PRD/SPEC pelo provider, mantendo avulsas diretas. Ausente/manual preserva execução tradicional; `autonomous` também permite Task gerenciada explícita. Legados já tentados exigem `task migrate-autonomy` revisado; nenhum consumo é zerado.
74
+ 1. Leia `execution.runtime`. O padrão novo `codex_native` mantém o despacho no host Codex e exige subagentes nativos também para Task avulsa; `managed` é compatibilidade explícita de provider para PRD/SPEC, mantendo avulsas diretas nesse contrato legado. Ausente/manual preserva execução tradicional; `autonomous` também permite Task gerenciada explícita. Legados já tentados exigem `task migrate-autonomy` revisado; nenhum consumo é zerado.
75
75
  2. Com `autonomy.version: 1`, aplique `RULE-AUTONOMY-DECISION` e seu ledger estável por Task. A seleção manual fica no principal avulso; subagentes seguem política automática com aviso. Sem esse bloco, preserve `automatic_sources` legado (`spec`,`prd`). Não alegue enforcement de orçamento/modelo em ferramenta nativa que não passou pelo dispatch gerenciado.
76
76
  3. Em autonomia, exija raiz Git limpa, worktree registrada por Task, commit final canônico sem alterações pendentes, diff dentro dos write scopes e merge abortável em conflito. A integração cria outro commit canônico por Task no histórico first-parent e referencia o SHA do candidato em `ZAIP-Product-Commit`.
77
77
  4. Use o menor paralelismo entre projeto, plano, provider e squad. Em `autonomy-v1`, orçamento por Task vem exclusivamente do preset congelado: Essencial 4/1, Equilibrado 10/3, Persistente ilimitado (execuções/replans); tempo não encerra Task. Risco/domain definem assurance, não esse orçamento. Só no contrato legado use as quotas anteriores por risco.
@@ -7,8 +7,8 @@ Carregue antes de executar uma entrega ou delegar. Este contrato detalha o kerne
7
7
  - Para delegação Codex, Sub-Run ZAIP é somente subagente nativo de colaboração (`spawn_agent`). `create_thread` e `fork_thread` criam chats independentes e exigem pedido explícito do usuário; nunca são Sub-Run, fallback, retry ou prova de delegação. Se delegação nativa estiver indisponível, relate a limitação em vez de criar chat independente. Nome de catálogo, `task_name`, título ou prompt não prova ancestralidade nativa. Antes de repetir a mesma delegação limitada, aguarde ou reutilize seu filho pendente e capture somente ancestralidade/metadados observados em resultados nativos de spawn/terminal do host ou eventos SubagentStart/SubagentStop.
8
8
  - Cada `client_turn_id` observável tem uma Execution idempotente/claim atômico; sem ele use identidade local sem prometer idempotência. `interaction` read-only sem descendentes é conversa sem Task artificial e termina após a resposta entregue, sem executor ou finalizador; interaction com trabalho delegado e `delivery` exigem executor/finalizador. `delivery` é trabalho materializado e reuso exige kind/origem compatíveis. A raiz é `zaip-agent-orchestrator`; quando a barreira é exigida escolha executor por capacidade, permita reviewer/auditor/integrator e termine com `zaip-agent-finalizer` em `finalization`, após descendentes, bloqueando novas chamadas.
9
9
  - Hooks são best-effort: após cada spawn/terminal, o host autorizado a serviço do orquestrador executa `zaip subagent capture` idempotente com metadados reais. Na captura rica, preserve session/turn observados, `agent-id` com a identidade nativa retornada e `parent-agent-id`/`parent-run-id` do pai imediato exato; cada invocação preserva seu turn. Quando um evento terminal observado expõe somente agent_path, status, identidade catalogada e pai exato, `capture-terminal` aceita apenas `zaip-agent-finalizer` ou executor elegível para delivery com capacidade `task-delivery`; exige também `parent-run-id` igual ao `run_id` da raiz ativa exata, pois um client thread pode conter raízes concorrentes. O último segmento do agent_path deve ser seu `codex_task_name` canônico. O propósito deriva da identidade validada e session/turn/model/provider/usage permanecem indisponíveis; o fallback nunca substitui captura rica nem inventa modelo, effort, tokens ou custo.
10
- - Em `autonomy-v1`, carregue `RULE-AUTONOMY-DECISION`. Task avulsa preserva seleção manual do principal, evita subagentes e só delega por necessidade concreta; quando delegar, informe que modelo/esforço dos filhos seguem a política ZAIP, sem obrigação de herdar o principal. Fixe configuração por chamada e registre seleção efetivamente observada. Sem `autonomy`, preserve o contrato legado de `automatic_sources` (`spec`,`prd`).
11
- - Escaladas seguem o perfil congelado: Essencial nunca Astra automático; Equilibrado Sol/high, Astra/high, Astra/high, com execução Astra/high elegível no terceiro bloco; Persistente sem quota total. `RULE-ASTRA-DIAGNOSTIC` descreve também compatibilidade legada. Não use título/volume como prova nem alegue mudança de modelo apenas pelo prompt.
10
+ - Em `autonomy-v1`, carregue `RULE-AUTONOMY-DECISION`. Conversation sem entrega responde diretamente; Task avulsa no padrão `codex_native` usa executor e Gui nativos. O principal preserva a seleção manual do host; cada filho segue a seleção ZAIP por papel/risco/fase, registrada conforme o modelo/esforço efetivamente observados. Capacidade ausente bloqueia a tentativa, nunca é substituída por prompt. Sem `autonomy`, preserve o contrato legado de `automatic_sources` (`spec`,`prd`).
11
+ - Escaladas seguem o perfil congelado: Essencial nunca Astra automático; Equilibrado Sol/high, Sol/high, Astra/high, com execução Astra/high elegível no terceiro bloco; Persistente sem quota total. `RULE-ASTRA-DIAGNOSTIC` descreve também compatibilidade legada. Não use título/volume como prova nem alegue mudança de modelo apenas pelo prompt.
12
12
  - Todo PreparedPlan PRD/SPEC traz `model_signals` por Task; o framework persiste `model_profile`, `task-risk-v1` e motivos, usando `runtime_defaults`, `runtime`, política/defaults sem `standard` silencioso. Não infira fase/complexidade/transversalidade/ambiguidade/rework/custo/capacidade por contagem de arquivos; use sinais, fase/agente e capacidades. Cabeçalho e `model.selection.recorded` repetem a seleção enviada.
13
13
  - Plano visível: `DEFINE:`, `PLAN:`, `EXECUTE:` ou `VERIFY:`, 3–4 passos (máximo 5); omita fase sem ação e combine trivialidades.
14
14
 
@@ -57,22 +57,34 @@ test("deploy guidance preserves canonical Task identity and builder-versus-consu
57
57
  assert.ok(skill.includes("[CODEX|CLAUDE] [P:XXXX] [S:XXXX] [T:XXXX] <Task title>"));
58
58
  assert.match(skill, /exclusively `CODEX` or `CLAUDE`; `AUTO` is not part/);
59
59
  assert.match(skill, /Consumer repositories follow their own GitHub-only policy/);
60
- assert.match(skill, /“faça deploy” means the guarded push, GitHub Release and observation of the GitHub Actions npm publication/);
60
+ assert.match(
61
+ skill,
62
+ /“faça deploy” means the guarded push, GitHub Release and observation of the GitHub Actions npm publication/,
63
+ );
61
64
  assert.match(workflow, /commitar o diff evidenciado com pathspecs explícitos/);
62
65
  });
63
66
 
64
67
  test("framework deploy follows Release-triggered npm publication without claiming partial success", async () => {
65
- const [skill, workflow, publishWorkflow] = await Promise.all([
68
+ const [skill, workflow, lock] = await Promise.all([
66
69
  readFile(resolve(skillRoot, "SKILL.md"), "utf8"),
67
70
  readFile(resolve(skillRoot, "references", "deployment-workflow.md"), "utf8"),
68
- readFile(resolve(root, "..", ".github", "workflows", "publish-cli.yml"), "utf8"),
71
+ readFile(resolve(root, "config", "framework.lock.yaml"), "utf8"),
69
72
  ]);
70
- assert.match(publishWorkflow, /release:\s*\n\s*types: \[published\]/);
71
- assert.match(publishWorkflow, /npm publish /);
73
+ if (!lock.startsWith("# Generated transactionally by @zaip-ai/cli")) {
74
+ const publishWorkflow = await readFile(
75
+ resolve(root, "..", ".github", "workflows", "publish-cli.yml"),
76
+ "utf8",
77
+ );
78
+ assert.match(publishWorkflow, /release:\s*\n\s*types: \[published\]/);
79
+ assert.match(publishWorkflow, /npm publish /);
80
+ }
72
81
  assert.match(skill, /publish-cli\.yml.*registry confirmation/s);
73
82
  assert.match(skill, /npm fails or cannot be observed.*partial or blocked/);
74
83
  assert.match(skill, /explicit push-only request.*does not create a Release or publish npm/);
75
- assert.match(workflow, /private Ed25519 release key is distinct from the Git SSH key and a local `\.env` npm token/);
84
+ assert.match(
85
+ workflow,
86
+ /private Ed25519 release key is distinct from the Git SSH key and a local `\.env` npm token/,
87
+ );
76
88
  assert.match(workflow, /A published Release with failed or unobserved npm is partial/);
77
89
  });
78
90
 
@@ -8,10 +8,10 @@ description: Install or update the native Codex hourly scheduler for the ready-w
8
8
  Use esta skill somente quando a pessoa solicitar instalar, atualizar ou verificar o agendamento local da fila pronta. Ela configura o relógio; não inicia uma execução por conta própria.
9
9
 
10
10
  1. Confirme que o repositório é ZAIP habilitado e que a automação nativa de tarefas agendadas do Codex Desktop está chamável, com capacidade `automation_update`. Pare com `blocked` se ela não estiver disponível. Nunca use o Agendador do Windows, um arquivo, Git ou uma promessa de execução futura como substituto.
11
- 2. Use `codex_app list_projects` para resolver o projeto Codex atual e seu checkout local real; não invente identificador, diretório ou contexto. Crie ou atualize, sem duplicar, a tarefa standalone de nome estável `ZAIP-AIOS - Fila Pronta Horária`: a cada hora, no minuto 0, em nova conversa no projeto resolvido. Ela abre uma única invocação com o prompt explícito `Ignore Automation memory and $CODEX_HOME. Start immediately by validating the repository and ready queue. First call codex_app set_thread_title without threadId, using America/Sao_Paulo local time in the exact format [YYYY-MM-DD-T-HH-mm] Tarefa Agendada; record a rename failure but continue the queue. Use $zaip-skill-executar-fila-pronta; this user-installed schedule authorizes only canonically ready/eligible items, never promotes draft or resumes blocked or failed work; respect the persisted manual order in .agents/dashboard/work-priority.json.`
11
+ 2. Use `codex_app list_projects` para resolver o projeto Codex atual e seu checkout local real; não invente identificador, diretório ou contexto. Crie ou atualize, sem duplicar, a tarefa standalone de nome estável `ZAIP-AIOS - Fila Pronta Horária`: a cada hora, no minuto 0, em nova conversa no projeto resolvido. Ela abre uma única invocação com o prompt explícito `Ignore Automation memory and $CODEX_HOME. Start immediately by validating the repository and ready queue. First call codex_app set_thread_title without threadId, using America/Sao_Paulo local time in the exact format [YYYY-MM-DD-T-HH-mm] Tarefa Agendada; record a rename failure but continue the queue. Use $zaip-skill-executar-fila-pronta; execute at most one top-level eligible item in this invocation, even if it finishes or becomes ineligible; never promote draft or resume blocked or failed work; respect the persisted manual order in .agents/dashboard/work-priority.json.`
12
12
  3. Antes de gravar, valide o checkout: raiz Git existente, `.agents/config/project.yaml` com `zaip.enabled: true`, runtime ZAIP disponível e caminho absoluto sem credenciais. Falhe fechado se algum requisito faltar; não registre uma tarefa parcial.
13
13
  4. Consulte `$CODEX_HOME/automations/*/automation.toml` somente em leitura, exclusivamente pelo nome estável para resolver identidade e deduplicação. É proibido criar, editar ou apagar TOML, ou usá-lo como fallback. Todas as visualizações e mutações da automação são exclusivamente por `codex_app automation_update`. Se houver mais de uma tarefa com esse nome, pare e reporte o conflito sem apagar nada. Se houver uma, inspecione seu ID, ação, agenda horária, nova conversa e diretório de trabalho e atualize-a; se não houver, crie uma. Preserve tarefas agendadas fora desse nome.
14
- 5. Verifique após criar/atualizar que existe exatamente uma tarefa com o nome, agenda a cada hora no minuto 0, nova conversa, checkout esperado e prompt da skill executora que respeita `.agents/dashboard/work-priority.json`. Registre somente a evidência observada; não afirme que uma hora futura será executada.
14
+ 5. Verifique após criar/atualizar que existe exatamente uma tarefa com o nome, agenda a cada hora no minuto 0, nova conversa, checkout esperado e prompt da skill executora que respeita `.agents/dashboard/work-priority.json` e limita a rodada a um item superior. Registre somente a evidência observada; não afirme que uma hora futura será executada.
15
15
  6. Explique que o agendamento pertence à máquina e ao usuário que o instalou. O repositório versiona a skill e o contrato, mas não cria um relógio em clones, nem funciona com a máquina desligada, o Codex Desktop fechado ou sem a automação nativa.
16
16
 
17
17
  Não use esta skill para selecionar itens, burlar bloqueios, executar todos os itens `planned`, alterar prioridades do Kanban ou fazer deploy/push.
@@ -19,6 +19,12 @@ policy, gate definitions, runtime, channel, version, trusted key, expiry and art
19
19
  Consumer projects run their own policy commands through the distributed consumer helper, with
20
20
  their configured branch (default `beta`) and no framework npm requirements.
21
21
  The deployment skill must call the guarded helper, which prepares and verifies before sending.
22
+ A framework signing key is resolved from the stable private directory
23
+ `~/.codex/release-keys/zaip-aios/<trusted-key-id>/` unless explicit paths are supplied.
24
+ Run `scripts/local-release-key.mjs preflight` before expensive gates; compare the local key
25
+ and trust with GitHub when publishing. A missing or mismatched key fails closed. Do not
26
+ silently generate a replacement, reuse a key ID for different key material, or remove the
27
+ signature gate. See the local preparation guide for testing and controlled rotation.
22
28
  A changed candidate or invalid evidence requires new qualification.
23
29
  Full source qualification runs locally. Extended GitHub qualification is manual;
24
30
  the reduced publisher requires enrolled public trust and signed local qualification.
@@ -4,6 +4,43 @@ Preparation does not authorize publication. Use guarded delivery only for an exp
4
4
  Store keys, trust stores, receipts and artifacts outside the repository. Commit and synchronize first;
5
5
  every gate is bound to the resulting clean SHA. Repair changes require a new candidate.
6
6
 
7
+ The signing key ID is the trusted identity, not a filename. Resolve it with
8
+ `gh variable get ZAIP_LOCAL_RELEASE_TRUSTED_KEY_ID --repo zaip-ai/zaip-aios`.
9
+ By default, the private key lives at
10
+ `~/.codex/release-keys/zaip-aios/<key-id>/release-private.pem` and its local
11
+ trust store at `~/.codex/release-keys/zaip-aios/<key-id>/trust/` on the current
12
+ machine. This location is shared by the machine's worktrees but never by Git.
13
+ Keep a secure backup and restrict OS access; Git ignore alone does not protect a
14
+ private key. `.local/` may hold a pointer or disposable test evidence, but must not
15
+ be the only copy of a production signing key.
16
+
17
+ Run `node scripts/local-release-key.mjs preflight --key-id <trusted-key-id> --channel latest --github-repo zaip-ai/zaip-aios` before the expensive release
18
+ gates. It checks the private/public pair, local trust and the GitHub public key
19
+ without printing key material. Omit `--github-repo` to test completely offline.
20
+ `prepare` and `local-release-deploy` resolve the stable paths automatically;
21
+ `--private-key` and `--trust-store` remain explicit overrides. Missing/mismatched
22
+ material blocks before qualification. Never auto-create a signing key during deploy.
23
+
24
+ For a local-only proof, generate an ephemeral Ed25519 pair outside the repository,
25
+ bootstrap a temporary trust store, then run `preflight` without `--github-repo` and
26
+ the release helper with `--dry-run --offline-dry-run`, explicit temporary
27
+ key/trust paths and an exact
28
+ clean candidate. The receipt must verify against that temporary trust store; this
29
+ does **not** authorize production publication or claim GitHub trust.
30
+
31
+ If the production private key is genuinely unavailable, rotate only with explicit
32
+ authorization. Use a **new** key ID and a new stable directory; never create a new
33
+ pair under the old ID or overwrite an existing key. Bootstrap the new local trust,
34
+ run offline preflight, then run
35
+ `node scripts/local-release-key.mjs rotate --confirm-rotate --github-repo zaip-ai/zaip-aios --expected-old-key-id <old-id> --new-key-id <new-id> --public-key <new-public.pem> --backup-dir <new-external-backup-directory>`.
36
+ The rotation saves the old public trust for rollback, updates only the trusted
37
+ public key and ID, verifies readback, and attempts rollback on error. It does not
38
+ alter the policy, publish a Release, or touch npm credentials. Do not rotate
39
+ while a release publisher is running. Verify the resulting `preflight` with
40
+ `--github-repo` before the next candidate qualification. Protect and separately
41
+ back up the private key; the trust backup contains only public material. Restoring
42
+ the old public trust alone cannot resume signing when the old private key is lost.
43
+
7
44
  ## Framework repository: main and GitHub Actions npm
8
45
 
9
46
  These commands exist only in the source repository `zaip-ai/zaip-aios`. Values in angle brackets
@@ -11,15 +48,20 @@ must be replaced with the authorized candidate and external paths. GitHub versio
11
48
  to tag `vN.N` and package version `N.N.0`.
12
49
 
13
50
  ```text
14
- node scripts/local-release-preparation.mjs keygen --output-dir <new-key-directory>
15
- node scripts/local-release-preparation.mjs bootstrap --trust-store <trust-directory> --public-key <public-key.pem> --key-id maintainer --channels latest
16
- node scripts/local-release-preparation.mjs prepare --repository <absolute-repository> --expected-repository zaip-ai/zaip-aios --sha <40-character-sha> --output-dir <candidate-artifacts> --policy <policy.json> --private-key <private-key.pem> --key-id maintainer --channel latest --version <N.N> --expires-at <future-ISO-within-seven-days> --trust-store <trust-directory> --profile essential
51
+ node scripts/local-release-preparation.mjs keygen --output-dir <new-stable-private-key-directory>
52
+ node scripts/local-release-preparation.mjs bootstrap --trust-store <new-stable-private-key-directory>/trust --public-key <new-stable-private-key-directory>/release-public.pem --key-id <new-key-id> --channels latest
53
+ node scripts/local-release-key.mjs preflight --key-id <new-key-id> --channel latest
54
+ node scripts/local-release-preparation.mjs prepare --repository <absolute-repository> --expected-repository zaip-ai/zaip-aios --sha <40-character-sha> --output-dir <candidate-artifacts> --policy <policy.json> --key-id <trusted-key-id> --channel latest --version <N.N> --expires-at <future-ISO-within-seven-days> --profile essential
17
55
  ```
18
56
 
19
57
  The framework policy is an administrator-reviewed file whose bytes must match the protected
20
58
  GitHub policy before Release publication. The user's 2026-09-23 authorization permits the
21
59
  builder deploy to update only `ZAIP_LOCAL_RELEASE_POLICY_B64` for each exact new version after
22
60
  successful signed local qualification, with byte-for-byte readback and no key/trust rotation.
61
+ The user separately authorized a one-time trust rotation on 2026-09-25 after the
62
+ `maintainer-v3` private key could not be located. The active trust ID is now
63
+ `maintainer-v4`; the old public trust is backed up outside the repository for
64
+ rollback. This does not authorize future rotations without an explicit request.
23
65
  The policy must name the exact repository, `main`, channel, `N.N`/`N.N.0` versions, selected
24
66
  fixed qualification profile, `github-actions-only`, `signed-release-linux-smoke`, and disabled
25
67
  force/replacement/pilot flags. Do not reuse an older version's policy unchanged or ask again
@@ -28,7 +70,7 @@ fails at the first failed gate. The default `essential-v3` profile validates sou
28
70
  build/type integrity, package/SBOM/TGZ binding, dependency audit and one clean installed-consumer
29
71
  doctor/SQLite/API smoke. It does not run browser navigation across every dashboard tab or XLSX
30
72
  exports. `--profile full` explicitly selects `full-v2`, which also runs the full source suite,
31
- browser and XLSX qualification. Essential preparation has a 15-minute deadline; full preparation
73
+ browser and XLSX qualification. Essential preparation has a 30-minute deadline; full preparation
32
74
  has a 60-minute deadline. Both use process-tree
33
75
  termination and cleanup after expiry. A failure never produces a successful receipt. Receipts bind
34
76
  the selected profile and its fixed gate list, so former receipts require requalification.
@@ -48,7 +90,7 @@ is refused. Choose a new output path after repair instead of deleting or overwri
48
90
  For an authorized release, call this command with the same arguments and paths:
49
91
 
50
92
  ```text
51
- node scripts/local-release-deploy.mjs --repository <absolute-repository> --expected-repository zaip-ai/zaip-aios --sha <40-character-sha> --branch main --output-dir <candidate-artifacts> --policy <policy.json> --private-key <private-key.pem> --key-id maintainer --channel latest --version <N.N> --expires-at <future-ISO-within-seven-days> --trust-store <trust-directory> --notes-file <reviewed-notes.md> --inventory-file <release-inventory.json> --from <previous-release-tag> --profile essential
93
+ node scripts/local-release-deploy.mjs --repository <absolute-repository> --expected-repository zaip-ai/zaip-aios --sha <40-character-sha> --branch main --output-dir <candidate-artifacts> --policy <policy.json> --key-id <trusted-key-id> --channel latest --version <N.N> --expires-at <future-ISO-within-seven-days> --notes-file <reviewed-notes.md> --inventory-file <release-inventory.json> --from <previous-release-tag> --profile essential
52
94
  ```
53
95
 
54
96
  `--dry-run` prepares and verifies without sending. The live command verifies again around