@zaip-ai/cli 1.0.8 → 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 (212) hide show
  1. package/README.md +1 -1
  2. package/dist/services/adapters.d.ts +1 -1
  3. package/dist/services/adapters.js +1 -1
  4. package/dist/services/agent-adapters.js +2 -2
  5. package/dist/services/agent-adapters.js.map +1 -1
  6. package/dist/services/agent-adapters.test.js +5 -0
  7. package/dist/services/agent-adapters.test.js.map +1 -1
  8. package/dist/services/logger.test.js +2 -2
  9. package/dist/services/runtime-template.test.js +6 -6
  10. package/dist/services/template-manifest.d.ts.map +1 -1
  11. package/dist/services/template-manifest.js +5 -0
  12. package/dist/services/template-manifest.js.map +1 -1
  13. package/package.json +1 -1
  14. package/templates/.agents/architecture/software-architecture.md +131 -0
  15. package/templates/.agents/branding/brandbook.docx +0 -0
  16. package/templates/.agents/branding/brandbook.md +60 -0
  17. package/templates/.agents/config/clients/codex/agents/zaip-agent-finalizer.toml +1 -1
  18. package/templates/.agents/config/clients/codex/agents/zaip-agent-orchestrator.toml +1 -1
  19. package/templates/.agents/dashboard/.tmp-run-list.json +254 -0
  20. package/templates/.agents/dashboard/.zaip-managed.json +252 -136
  21. package/templates/.agents/dashboard/apps/frontend/dist/assets/{CostCalculationGuidePage-Z60df2r-.js → CostCalculationGuidePage-DxR_pgSV.js} +1 -1
  22. package/templates/.agents/dashboard/apps/frontend/dist/assets/DashboardHelpDialog-4jZLTWE_.js +2156 -0
  23. package/templates/.agents/dashboard/apps/frontend/dist/assets/{PricingSettingsDialog-Coc6pA-1.js → PricingSettingsDialog-CKcsqb-r.js} +1 -1
  24. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-BomxqCBU.css +1 -0
  25. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-DmmJD2Th.js +3 -0
  26. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-BwtitWa_.js +1 -0
  27. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-N5Csr0RP.js +68 -0
  28. package/templates/.agents/dashboard/apps/frontend/dist/assets/{icons-vendor-DFBuc_qp.js → icons-vendor-C0fj2uU9.js} +1 -1
  29. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-C4aIB1PV.js +2 -0
  30. package/templates/.agents/dashboard/apps/frontend/dist/assets/{react-vendor-CCQOHdVI.js → react-vendor-BEsJ-FYH.js} +1 -1
  31. package/templates/.agents/dashboard/apps/frontend/dist/assets/{traceability-pC2_0J8x.js → traceability-B6y6Gw12.js} +1 -1
  32. package/templates/.agents/dashboard/apps/frontend/dist/index.html +5 -5
  33. package/templates/.agents/dashboard/apps/frontend/package.json +1 -1
  34. package/templates/.agents/dashboard/apps/frontend/src/App.tsx +204 -32
  35. package/templates/.agents/dashboard/apps/frontend/src/DashboardAlternateContent.tsx +11 -11
  36. package/templates/.agents/dashboard/apps/frontend/src/ProjectSettingsPage.tsx +14 -7
  37. package/templates/.agents/dashboard/apps/frontend/src/ProjectStackEditor.tsx +4 -2
  38. package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.test.ts +3 -1
  39. package/templates/.agents/dashboard/apps/frontend/src/TraceabilityWorkspace.tsx +14 -11
  40. package/templates/.agents/dashboard/apps/frontend/src/cost-period-refresh.test.ts +19 -4
  41. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.test.ts +24 -2
  42. package/templates/.agents/dashboard/apps/frontend/src/dashboard-api.ts +22 -1
  43. package/templates/.agents/dashboard/apps/frontend/src/overview-status-page.test.ts +3 -1
  44. package/templates/.agents/dashboard/apps/frontend/src/project-settings-page.css +36 -26
  45. package/templates/.agents/dashboard/apps/frontend/src/project-settings.test.ts +2 -2
  46. package/templates/.agents/dashboard/apps/frontend/src/snapshot-banner-semantics.test.ts +40 -6
  47. package/templates/.agents/dashboard/apps/frontend/src/snapshot-coherence.test.ts +39 -1
  48. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.test.ts +89 -23
  49. package/templates/.agents/dashboard/apps/frontend/src/use-app-cost-loaders.ts +219 -29
  50. package/templates/.agents/dashboard/apps/frontend/src/use-app-effects.ts +61 -7
  51. package/templates/.agents/dashboard/apps/frontend/src/use-app-operations-pages.ts +3 -6
  52. package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.test.ts +2 -2
  53. package/templates/.agents/dashboard/apps/frontend/src/work-list-pagination.ts +3 -4
  54. package/templates/.agents/dashboard/apps/frontend/vite.config.ts +4 -1
  55. package/templates/.agents/dashboard/modules/cost-monitor/package.json +1 -1
  56. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.test.ts +89 -19
  57. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CompactLifecycleCostTable.tsx +31 -16
  58. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.test.ts +43 -14
  59. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostCharts.tsx +5 -5
  60. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostModelsAuditTable.tsx +1 -1
  61. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorContent.tsx +67 -42
  62. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.test.ts +115 -39
  63. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostMonitorPage.tsx +188 -38
  64. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.test.ts +75 -17
  65. package/templates/.agents/dashboard/modules/cost-monitor/src/react/CostTables.tsx +147 -58
  66. package/templates/.agents/dashboard/modules/cost-monitor/src/react/cost-monitor.css +5 -2
  67. package/templates/.agents/dashboard/modules/cost-monitor/src/react/index.ts +2 -2
  68. package/templates/.agents/dashboard/modules/cost-monitor/src/react/period-cost-groups.ts +2 -1
  69. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-compact-cost-page.ts +18 -7
  70. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-group-page.ts +95 -9
  71. package/templates/.agents/dashboard/modules/cost-monitor/src/react/use-cost-run-page.ts +29 -17
  72. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-monitor-projection.test.ts +0 -24
  73. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.test.ts +225 -424
  74. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-projection.ts +24 -15
  75. package/templates/.agents/dashboard/modules/cost-monitor/src/server/build-cost-summary-terminal-day.test.ts +6 -1
  76. package/templates/.agents/dashboard/modules/cost-monitor/src/server/source-size-cost-server/build-cost-monitor-projection-agents.test.ts +31 -0
  77. package/templates/.agents/dashboard/modules/cost-monitor/src/server/source-size-cost-server/build-cost-summary-projection-duration.test.ts +414 -0
  78. package/templates/.agents/dashboard/modules/operations/package.json +1 -1
  79. package/templates/.agents/dashboard/modules/operations/src/contracts.ts +26 -23
  80. package/templates/.agents/dashboard/modules/operations/src/react/EntityTables.tsx +31 -11
  81. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.test.ts +3 -1
  82. package/templates/.agents/dashboard/modules/operations/src/react/OperationsOverview.tsx +51 -21
  83. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPage.tsx +47 -5
  84. package/templates/.agents/dashboard/modules/operations/src/react/OperationsPageNavigation.tsx +1 -4
  85. package/templates/.agents/dashboard/modules/operations/src/react/PeriodSummaryTable.tsx +32 -10
  86. package/templates/.agents/dashboard/modules/operations/src/react/TaskDetailsDialog.tsx +9 -3
  87. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkBoard.tsx +13 -5
  88. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.test.ts +12 -4
  89. package/templates/.agents/dashboard/modules/operations/src/react/UnifiedWorkList.tsx +1 -4
  90. package/templates/.agents/dashboard/modules/operations/src/react/conversation-rows.ts +1 -2
  91. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.test.ts +385 -4
  92. package/templates/.agents/dashboard/modules/operations/src/react/export/ExcelExportAction.tsx +481 -61
  93. package/templates/.agents/dashboard/modules/operations/src/react/export/export-layout.test.ts +14 -1
  94. package/templates/.agents/dashboard/modules/operations/src/react/export/xlsx-runtime-e2e.test.ts +248 -0
  95. package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.test.ts +4 -4
  96. package/templates/.agents/dashboard/modules/operations/src/react/operation-duration.ts +6 -4
  97. package/templates/.agents/dashboard/modules/operations/src/react/operations-global-filters.test.ts +4 -1
  98. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview-period-filter.test.ts +1 -1
  99. package/templates/.agents/dashboard/modules/operations/src/react/operations-overview.status-cards.test.ts +1 -1
  100. package/templates/.agents/dashboard/modules/operations/src/react/operations-page-contract.ts +46 -6
  101. package/templates/.agents/dashboard/modules/operations/src/react/operations-view-order.test.ts +1 -4
  102. package/templates/.agents/dashboard/modules/operations/src/react/period-summary.test.ts +82 -6
  103. package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.test.ts +2 -1
  104. package/templates/.agents/dashboard/modules/operations/src/react/work-board-model.ts +1 -1
  105. package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.test.ts +19 -7
  106. package/templates/.agents/dashboard/modules/operations/src/server/execution-relationship-counts.ts +4 -1
  107. package/templates/.agents/dashboard/modules/operations/src/server/quick-daily-operations-projection.ts +11 -5
  108. package/templates/.agents/dashboard/modules/traceability/package.json +1 -1
  109. package/templates/.agents/dashboard/packages/branding/package.json +1 -1
  110. package/templates/.agents/dashboard/packages/branding/src/index.ts +1 -1
  111. package/templates/.agents/dashboard/packages/contracts/package.json +1 -1
  112. package/templates/.agents/dashboard/packages/contracts/src/index.ts +1 -0
  113. package/templates/.agents/dashboard/packages/data-export/package.json +1 -1
  114. package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs +152 -149
  115. package/templates/.agents/dashboard/packages/local-runtime/dist/server.cjs.metafile.json +7333 -0
  116. package/templates/.agents/dashboard/packages/local-runtime/dist/sqlite-read-model.cjs +149 -146
  117. package/templates/.agents/dashboard/packages/local-runtime/package.json +1 -1
  118. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-dashboard.mjs +15 -7
  119. package/templates/.agents/dashboard/packages/local-runtime/scripts/build-sqlite-runtime.mjs +44 -13
  120. package/templates/.agents/dashboard/packages/local-runtime/scripts/rebuild-sqlite-read-model.mjs +5 -2
  121. package/templates/.agents/dashboard/packages/local-runtime/scripts/source-size-runtime-scripts/sqlite-read-model-fixture.mjs +397 -0
  122. package/templates/.agents/dashboard/packages/local-runtime/scripts/test-sqlite-read-model.mjs +472 -145
  123. package/templates/.agents/dashboard/packages/local-runtime/scripts/test-unix-launchers.mjs +15 -3
  124. package/templates/.agents/dashboard/packages/local-runtime/scripts/validate-sqlite-read-model.mjs +129 -31
  125. package/templates/.agents/dashboard/packages/local-runtime/server.mjs +153 -150
  126. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.test.ts +6 -2
  127. package/templates/.agents/dashboard/packages/local-runtime/src/project-settings.ts +3 -3
  128. package/templates/.agents/dashboard/packages/local-runtime/src/server-board.test.ts +55 -16
  129. package/templates/.agents/dashboard/packages/local-runtime/src/server-board.ts +23 -13
  130. package/templates/.agents/dashboard/packages/local-runtime/src/server-snapshot.test.ts +19 -4
  131. package/templates/.agents/dashboard/packages/local-runtime/src/server-workspace.ts +7 -3
  132. package/templates/.agents/dashboard/packages/local-runtime/src/server.test.ts +132 -9
  133. package/templates/.agents/dashboard/packages/local-runtime/src/server.ts +126 -60
  134. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-metric-contract.ts +16 -2
  135. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.test.ts +1861 -350
  136. package/templates/.agents/dashboard/packages/local-runtime/src/sqlite-read-model.ts +1218 -352
  137. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.mjs +119 -42
  138. package/templates/.agents/dashboard/packages/local-runtime/start-dashboard.test.mjs +45 -20
  139. package/templates/.agents/dashboard/packages/ui/package.json +1 -1
  140. package/templates/.agents/dashboard/tests/e2e/package.json +1 -1
  141. package/templates/.agents/dashboard/tests/e2e/specs/dashboard.spec.ts +7 -5
  142. package/templates/.agents/design/.zaip-managed.json +3 -3
  143. package/templates/.agents/design/apps/catalog/package.json +1 -1
  144. package/templates/.agents/design/packages/local-runtime/package.json +1 -1
  145. package/templates/.agents/growth/estrategia-bootstrap-90-dias.md +169 -0
  146. package/templates/.agents/growth/strategy.md +27 -0
  147. package/templates/.agents/marketing/estrategia-marketing-zaip-90-dias.md +197 -0
  148. package/templates/.agents/marketing/strategy.md +29 -0
  149. package/templates/.agents/requirements/autonomous-assurance.md +1 -1
  150. package/templates/.agents/requirements/comparative-audit.md +1 -1
  151. package/templates/.agents/requirements/context-engine.md +1 -1
  152. package/templates/.agents/requirements/cost-observability.md +1 -1
  153. package/templates/.agents/requirements/dashboard-launch.md +1 -1
  154. package/templates/.agents/requirements/data-export.md +1 -1
  155. package/templates/.agents/requirements/design-system.md +1 -1
  156. package/templates/.agents/requirements/execution-engine.md +1 -1
  157. package/templates/.agents/requirements/kanban-dashboard.md +1 -1
  158. package/templates/.agents/requirements/model-orchestration.md +1 -1
  159. package/templates/.agents/requirements/public-distribution.md +1 -1
  160. package/templates/.agents/requirements/software-architecture.md +1 -1
  161. package/templates/.agents/requirements/strategic-improvements.md +1 -1
  162. package/templates/.agents/requirements/work-lifecycle.md +1 -1
  163. package/templates/.agents/requirements/zaip-strategic-95.md +1 -1
  164. package/templates/.agents/runtime/VERSION +1 -1
  165. package/templates/.agents/runtime/bin/zaip.mjs +30 -29
  166. package/templates/.agents/runtime/checksums.sha256 +6 -6
  167. package/templates/.agents/runtime/manifest.json +1 -1
  168. package/templates/.agents/runtime/pnpm-lock.sha256 +1 -1
  169. package/templates/.agents/runtime/provenance.json +5 -5
  170. package/templates/.agents/runtime/sbom.cdx.json +3 -3
  171. package/templates/.agents/sales/playbook.md +32 -0
  172. package/templates/.agents/sales/roteiro-comercial-zaip.md +252 -0
  173. package/templates/.agents/skills/zaip-aios/SKILL.md +1 -1
  174. package/templates/.agents/skills/zaip-skill-brand-governance/SKILL.md +9 -2
  175. package/templates/.agents/skills/zaip-skill-brand-governance/references/brandbook-framework.md +39 -0
  176. package/templates/.agents/skills/zaip-skill-brand-governance/references/brandbook-standards.md +1 -1
  177. package/templates/.agents/skills/zaip-skill-enforce-architecture/SKILL.md +2 -0
  178. package/templates/.agents/skills/zaip-skill-growth-strategy-revops/SKILL.md +6 -0
  179. package/templates/.agents/skills/zaip-skill-marketing/SKILL.md +6 -0
  180. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-local-telemetry.mjs +39 -82
  181. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.mjs +13 -8
  182. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-lib.test.mjs +44 -14
  183. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.mjs +19 -9
  184. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/reconcile-telemetry-remeasurement.test.mjs +29 -5
  185. package/templates/.agents/skills/zaip-skill-reconcile-telemetry/scripts/source-size-telemetry/model-identity-reconciliation.mjs +77 -0
  186. package/templates/.agents/skills/zaip-skill-sales-methodology/SKILL.md +6 -0
  187. package/templates/.agents/skills/zaip-skill-sqlite-read-model/scripts/ensure-node.mjs +28 -5
  188. package/templates/.agents/zaip-aios/INDEX.md +10 -0
  189. package/templates/.agents/zaip-aios/README.md +2 -1
  190. package/templates/.agents/zaip-aios/VERSION +1 -1
  191. package/templates/.agents/zaip-aios/guides/18-catalogo-de-agentes.md +76 -0
  192. package/templates/.agents/zaip-aios/guides/19-assurance-e-autonomia.md +72 -0
  193. package/templates/.agents/zaip-aios/guides/20-instalacao-detalhada.md +330 -0
  194. package/templates/.agents/zaip-aios/guides/21-telemetria-monitor-custos.md +52 -0
  195. package/templates/.agents/zaip-aios/guides/22-fluxos-e-roteamento.md +69 -0
  196. package/templates/.agents/zaip-aios/guides/23-orquestracao-de-modelos.md +483 -0
  197. package/templates/.agents/zaip-aios/guides/24-calculo-de-custos-openai.md +85 -0
  198. package/templates/.agents/zaip-aios/guides/25-fontes-de-precos-openai.md +18 -0
  199. package/templates/.agents/zaip-aios/guides/26-qualidade-e-release.md +44 -0
  200. package/templates/.agents/zaip-aios/guides/27-telemetria-git-native.md +167 -0
  201. package/templates/.agents/zaip-aios/guides/28-lifecycle-completo.md +144 -0
  202. package/templates/.agents/zaip-aios/guides/assets/diagrams/lifecycles-task-spec-prd.png +0 -0
  203. package/templates/.agents/zaip-aios/guides/assets/diagrams/prd-lifecycle.png +0 -0
  204. package/templates/.agents/zaip-aios/guides/assets/diagrams/spec-lifecycle.png +0 -0
  205. package/templates/.agents/zaip-aios/guides/assets/diagrams/task-lifecycle.png +0 -0
  206. package/templates/template-manifest.json +313 -177
  207. package/templates/.agents/dashboard/apps/frontend/dist/assets/DashboardHelpDialog-Cs6dzDmW.js +0 -1505
  208. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-QE1k9yZB.css +0 -1
  209. package/templates/.agents/dashboard/apps/frontend/dist/assets/ProjectSettingsPage-_Pf5DA_A.js +0 -3
  210. package/templates/.agents/dashboard/apps/frontend/dist/assets/TraceabilityWorkspace-BVlz3DLZ.js +0 -1
  211. package/templates/.agents/dashboard/apps/frontend/dist/assets/cost-monitor-Cf9ctPVt.js +0 -68
  212. package/templates/.agents/dashboard/apps/frontend/dist/assets/index-8A4DcNXM.js +0 -2
@@ -1,8 +1,9 @@
1
1
  import assert from "node:assert/strict";
2
- import { mkdtemp, mkdir, readFile, rm, utimes, writeFile } from "node:fs/promises";
3
- import { join, resolve } from "node:path";
2
+ import { mkdir, mkdtemp, readFile, rm, utimes, writeFile } from "node:fs/promises";
4
3
  import { createRequire } from "node:module";
4
+ import { join, resolve } from "node:path";
5
5
  import { DatabaseSync } from "node:sqlite";
6
+ import { fixture } from "./source-size-runtime-scripts/sqlite-read-model-fixture.mjs";
6
7
 
7
8
  const root = resolve(import.meta.dirname, "../../../../..");
8
9
  const sqliteTestTempRoot = resolve(root, ".tmp", "sqlite-read-model-tests");
@@ -19,7 +20,9 @@ async function loadReadModelRuntime() {
19
20
  const directory = await createSqliteTestDirectory("bundle-");
20
21
  const outfile = join(directory, "sqlite-read-model.cjs");
21
22
  await build({
22
- entryPoints: [resolve(root, ".agents/dashboard/packages/local-runtime/src/sqlite-read-model.ts")],
23
+ entryPoints: [
24
+ resolve(root, ".agents/dashboard/packages/local-runtime/src/sqlite-read-model.ts"),
25
+ ],
23
26
  outfile,
24
27
  bundle: true,
25
28
  platform: "node",
@@ -47,73 +50,6 @@ async function loadCostAdapterRuntime() {
47
50
  return { runtime: require(outfile), directory };
48
51
  }
49
52
 
50
- async function fixture() {
51
- const directory = await createSqliteTestDirectory("parity-");
52
- await mkdir(join(directory, ".agents/records/lifecycle/views"), { recursive: true });
53
- await mkdir(join(directory, ".agents/records/lifecycle/chunks"), { recursive: true });
54
- await mkdir(join(directory, ".agents/config"), { recursive: true });
55
- await writeFile(join(directory, ".agents/config/project.yaml"), "zaip:\n enabled: true\n");
56
- await mkdir(join(directory, ".agents/config/agents"), { recursive: true });
57
- await writeFile(join(directory, ".agents/config/agents/catalog.yaml"), "agents:\n - id: agent-a\n codex_name: agent-a\n persona: { nome: ana, cargo: quality_engineer }\n role: reviewer\n");
58
- await mkdir(join(directory, ".agents/records/telemetry/2026/08/writers/w/chunks"), { recursive: true });
59
- const summary = (id, hash, occurred_at, segments) => ({ schema_version: 1, agent_invocation_id: id, summary_hash: hash, root_agent_invocation_id: id, parent_agent_invocation_id: null, invocation_kind: "orchestrator", delegation_depth: 0, execution_id: null, task_id: null, spec_id: null, prd_id: null, change_id: null, run_id: id, occurred_at, status: "completed", coverage: "complete", source_event_count: 1, llm_call_count: 2, historical_cost: { estimated_usd: 2, estimated_brl: 10 }, quantitative_coverage: { tokens: "complete", duration_ms: "complete" }, quantitative_metrics: { duration_ms: { known_sum: 100 }, tokens_total: { known_sum: 15 }, estimated_usd: { known_sum: 2 }, estimated_brl: { known_sum: 10 } }, usage_segments: segments });
60
- const mixed = [{ provider: "openai", model: "a", service_tier: null, reasoning_effort: null, coverage: "complete", tokens: { input: 2, cached_input: 1, output: 3, reasoning: 4, total: 10 }, historical_cost: { estimated_usd: 1, estimated_brl: 5 } }, { provider: "other", model: "b", service_tier: null, reasoning_effort: null, coverage: "complete", tokens: { input: 5, cached_input: 0, output: 0, reasoning: 0, total: 5 }, historical_cost: { estimated_usd: 1, estimated_brl: 5 } }];
61
- const canonical = { ...summary("AINV-edge", "hash-edge", "2026-08-01T01:00:00.000Z", mixed), execution_id: "EXEC-a", task_id: "TASK-a", conversation_id: "CONV-a", zaip_agent: "agent-a", phase: "execution" };
62
- const augustBefore = { ...summary("AINV-aug-before", "hash-aug-before", "2026-08-05T04:00:00.000Z", mixed), zaip_agent: "agent-a", phase: "execution", quantitative_metrics: { duration_ms: { known_sum: 200 }, tokens_total: { known_sum: 15 }, estimated_usd: { known_sum: 2 }, estimated_brl: { known_sum: 10 } } };
63
- const unavailable = { ...summary("AINV-unavailable", "hash-unavailable", "2026-08-15T04:00:00.000Z", []), llm_call_count: null, status: "failed", zaip_agent: "agent-b", phase: "review", historical_cost: null, quantitative_coverage: { tokens: "unavailable", duration_ms: "unavailable" }, quantitative_metrics: { duration_ms: { known_sum: null }, tokens_total: { known_sum: null }, estimated_usd: { known_sum: null }, estimated_brl: { known_sum: null } } };
64
- const augustInside = { ...summary("AINV-aug-inside", "hash-aug-inside", "2026-08-20T04:00:00.000Z", mixed), zaip_agent: "agent-a", phase: "execution", quantitative_metrics: { duration_ms: { known_sum: 300 }, tokens_total: { known_sum: 15 }, estimated_usd: { known_sum: 2 }, estimated_brl: { known_sum: 10 } } };
65
- const lifecycle = [
66
- { operation: "upsert", entity: { kind: "task", id: "TASK-a", updated_at: "2026-07-31T22:00:00.000Z", data: { title: "Causal task", status: "active", risk: "critical", created_at: "2026-07-31T22:00:00.000Z" } } },
67
- { operation: "upsert", entity: { kind: "task", id: "TASK-zero", updated_at: "2026-08-10T22:00:00.000Z", data: { title: "Task without invocation", status: "ready", risk: "lite", created_at: "2026-08-10T22:00:00.000Z" } } },
68
- { operation: "upsert", entity: { kind: "spec", id: "SPEC-zero", updated_at: "2026-08-10T22:00:00.000Z", data: { title: "SPEC without invocation", status: "ready", risk: "lite", created_at: "2026-08-10T22:00:00.000Z" } } },
69
- { operation: "upsert", entity: { kind: "prd", id: "PRD-zero", updated_at: "2026-08-10T22:00:00.000Z", data: { title: "PRD without invocation", status: "ready", risk: "lite", created_at: "2026-08-10T22:00:00.000Z" } } },
70
- { operation: "upsert", entity: { kind: "execution", id: "EXEC-a", updated_at: "2026-07-31T22:00:00.000Z", data: { status: "completed", created_at: "2026-07-31T22:00:00.000Z" } } },
71
- { operation: "upsert", entity: { kind: "conversation", id: "CONV-a", updated_at: "2026-07-31T22:00:00.000Z", data: { status: "active", created_at: "2026-07-31T22:00:00.000Z" } } },
72
- { operation: "upsert", entity: { kind: "decision", id: "DEC-edge", updated_at: "2026-07-31T22:00:00.000Z", data: { status: "accepted", risk: "standard", created_at: "2026-07-31T22:00:00.000Z" } } },
73
- { operation: "upsert", entity: { kind: "change", id: "CHG-edge", updated_at: "2026-07-31T22:00:00.000Z", data: { status: "active", risk: "critical", created_at: "2026-07-31T22:00:00.000Z" } } },
74
- ];
75
- await writeFile(join(directory, ".agents/records/lifecycle/chunks/entities.jsonl"), `${lifecycle.map(JSON.stringify).join("\n")}\n`);
76
- await writeFile(join(directory, ".agents/records/telemetry/2026/08/writers/w/chunks/c.jsonl"), `${JSON.stringify(canonical)}\n${JSON.stringify(canonical)}\n${JSON.stringify(augustBefore)}\n${JSON.stringify(unavailable)}\n${JSON.stringify(augustInside)}\n`);
77
- await writeFile(join(directory, ".agents/records/telemetry/2026/08/writers/w/manifest.json"), JSON.stringify({ chunks: [{ path: ".agents/records/telemetry/2026/08/writers/w/chunks/c.jsonl" }] }));
78
- const canonicalRun = ({ runId, invocationId, occurredAt, duration, status = "completed", agent = "agent-a", phase = "execution", executionId = null, taskId = null, conversationId, segments = [] }) => {
79
- const started = {
80
- schema_version: 2, event_id: `${runId}:000001`, run_id: runId, sequence: 1, occurred_at: occurredAt, type: "run.started",
81
- attribution_status: "attributed", phase, run_role: "orchestrator", run_purpose: phase === "execution" ? "execution" : "orchestration",
82
- requires_finalizer: false, execution_kind: phase === "execution" ? "delivery" : "interaction", execution_eligibility: [phase === "execution" ? "delivery" : "interaction"],
83
- entrypoint: taskId === null ? "conversation" : "task", work_type: "new", storage_mode: "tracked_sanitized", client: "codex",
84
- agent, agent_name: agent, provider: segments.length > 0 ? segments[0].provider : null, model: segments.length > 0 ? segments[0].model : "unknown", reasoning_effort: null,
85
- client_thread_id: `thread-${runId}`, client_turn_id: `turn-${runId}`, conversation_id: conversationId, execution_id: executionId,
86
- task_id: taskId, spec_id: null, prd_id: null, change_id: null, parent_run_id: null, continuation_of_run_id: null, retry_of_run_id: null,
87
- ...(invocationId === null ? {} : { agent_invocation_id: invocationId, root_agent_invocation_id: invocationId, parent_agent_invocation_id: null, invocation_kind: "orchestrator", delegation_depth: 0 }),
88
- };
89
- const usage = segments.map((segment, index) => ({
90
- schema_version: 2, event_id: `${runId}:${String(index + 2).padStart(6, "0")}`, run_id: runId, sequence: index + 2, occurred_at: occurredAt,
91
- type: "usage.recorded", phase, activity_kind: "model_usage", classification_source: "explicit",
92
- tokens: { ...segment.tokens, source: "provider_reported" }, cost: { usd: segment.cost.usd, brl: segment.cost.brl, fx_rate: 5 },
93
- provider: segment.provider, model: segment.model, source_segment_key: `${runId}:${index}`, model_call_id: `MCALL-${runId}-${index}`,
94
- runtime: { reasoning_effort: null, service_tier: null }, supersedes_event_id: null,
95
- duration_ms: null, duration_provenance: null,
96
- }));
97
- const finished = { schema_version: 2, event_id: `${runId}:${String(usage.length + 2).padStart(6, "0")}`, run_id: runId, sequence: usage.length + 2, occurred_at: occurredAt, type: "run.finished", phase, status, duration_ms: duration, duration_provenance: duration === null ? "unavailable" : "observed" };
98
- return [...[started], ...usage, finished].map(JSON.stringify).join("\n") + "\n";
99
- };
100
- await mkdir(join(directory, ".agents/records/runs/2026/07"), { recursive: true });
101
- await mkdir(join(directory, ".agents/records/runs/2026/08"), { recursive: true });
102
- const canonicalSegments = [
103
- { provider: "openai", model: "a", tokens: { input: 2, cached_input: 1, output: 3, reasoning: 4, total: 10 }, cost: { usd: 1, brl: 5 } },
104
- { provider: "other", model: "b", tokens: { input: 5, cached_input: 0, output: 0, reasoning: 0, total: 5 }, cost: { usd: 1, brl: 5 } },
105
- ];
106
- const runs = [
107
- ["2026/07/RUN-edge.jsonl", { runId: "RUN-edge", invocationId: "AINV-edge", occurredAt: "2026-08-01T01:00:00.000Z", duration: 100, executionId: "EXEC-a", taskId: "TASK-a", conversationId: "CONV-a", segments: canonicalSegments }],
108
- ["2026/08/RUN-aug-before.jsonl", { runId: "RUN-aug-before", invocationId: "AINV-aug-before", occurredAt: "2026-08-05T04:00:00.000Z", duration: 200, executionId: "EXEC-before", conversationId: "CONV-before", segments: canonicalSegments }],
109
- ["2026/08/RUN-unavailable.jsonl", { runId: "RUN-unavailable", invocationId: "AINV-unavailable", occurredAt: "2026-08-15T04:00:00.000Z", duration: null, status: "failed", agent: "agent-b", phase: "conversation", conversationId: "CONV-unavailable", segments: [] }],
110
- ["2026/08/RUN-aug-inside.jsonl", { runId: "RUN-aug-inside", invocationId: "AINV-aug-inside", occurredAt: "2026-08-20T04:00:00.000Z", duration: 300, executionId: "EXEC-inside", conversationId: "CONV-inside", segments: canonicalSegments }],
111
- ["2026/08/RUN-unassisted.jsonl", { runId: "RUN-unassisted", invocationId: null, occurredAt: "2026-08-20T05:00:00.000Z", duration: null, agent: "root", phase: "conversation", conversationId: "CONV-unassisted", segments: [] }],
112
- ];
113
- for (const [path, value] of runs) await writeFile(join(directory, ".agents/records/runs", path), canonicalRun(value));
114
- return directory;
115
- }
116
-
117
53
  async function verify(runtime, rootPath, intervals) {
118
54
  await runtime.rebuildSqliteReadModel(rootPath);
119
55
  const filesystem = new runtime.SqliteReadModelFileSystem(rootPath);
@@ -121,97 +57,436 @@ async function verify(runtime, rootPath, intervals) {
121
57
  for (const [from, to] of intervals) {
122
58
  const aggregate = filesystem.firstFoldAggregate({ from, to });
123
59
  if (rootPath.includes("zaip-dashboard-sqlite-parity-") && from === null && to === null)
124
- assert.deepEqual(aggregate, { days: 4, total_run_count: 5, agent_invocation_count: 3, llm_call_count: 6, duration_ms: 600, total_tokens: 45, cost_brl: 30, execution_day_count: 3 });
60
+ assert.deepEqual(aggregate, {
61
+ days: 4,
62
+ total_run_count: 5,
63
+ agent_invocation_count: 3,
64
+ llm_call_count: 6,
65
+ duration_ms: 600,
66
+ total_tokens: 45,
67
+ cost_brl: 30,
68
+ execution_day_count: 3,
69
+ });
125
70
  }
126
71
  if (rootPath.includes("zaip-dashboard-sqlite-parity-")) {
127
72
  const database = new DatabaseSync(process.env.ZAIP_SQLITE_DB_PATH, { readOnly: true });
128
73
  try {
129
74
  const schema = runtime.validateSqliteReadModelSchema(process.env.ZAIP_SQLITE_DB_PATH);
130
- assert.deepEqual(schema, { schemaVersion: "59", tableCount: 5, viewCount: 107, indexCount: 15 });
131
- const objects = new Map(database.prepare("SELECT name, type FROM sqlite_master WHERE type IN ('table', 'view')").all().map((row) => [row.name, row.type]));
75
+ assert.deepEqual(schema, {
76
+ schemaVersion: "59",
77
+ tableCount: 5,
78
+ viewCount: 107,
79
+ indexCount: 15,
80
+ });
81
+ const objects = new Map(
82
+ database
83
+ .prepare("SELECT name, type FROM sqlite_master WHERE type IN ('table', 'view')")
84
+ .all()
85
+ .map((row) => [row.name, row.type]),
86
+ );
132
87
  const names = new Set(objects.keys());
133
- for (const name of ["zaip_aios_activities", "agent_runs", "root_runs", "sub_runs", "overview", "overview_daily", "overview_monthly", "overview_annual", "task_summary", "task_summary_daily", "spec_summary", "spec_summary_daily", "prd_summary", "prd_summary_daily", "task_status_daily", "task_risk_daily", "tasks", "specs", "prds", "executions", "conversations", "decisions", "changes", "work_items", "cost_monitor_group_daily", "cost_monitor_daily", "cost_monitor_agent_invocations", "operations_work_list", "operations_agent_invocations", "first_fold_overview", "first_fold_task", "first_fold_spec", "first_fold_prd"]) assert.ok(name === "zaip_aios_activities" ? names.has(name) : names.has(`zaip_vw_${name}`), `missing ${name}`);
88
+ for (const name of [
89
+ "zaip_aios_activities",
90
+ "agent_runs",
91
+ "root_runs",
92
+ "sub_runs",
93
+ "overview",
94
+ "overview_daily",
95
+ "overview_monthly",
96
+ "overview_annual",
97
+ "task_summary",
98
+ "task_summary_daily",
99
+ "spec_summary",
100
+ "spec_summary_daily",
101
+ "prd_summary",
102
+ "prd_summary_daily",
103
+ "task_status_daily",
104
+ "task_risk_daily",
105
+ "tasks",
106
+ "specs",
107
+ "prds",
108
+ "executions",
109
+ "conversations",
110
+ "decisions",
111
+ "changes",
112
+ "work_items",
113
+ "cost_monitor_group_daily",
114
+ "cost_monitor_daily",
115
+ "cost_monitor_agent_invocations",
116
+ "operations_work_list",
117
+ "operations_agent_invocations",
118
+ "first_fold_overview",
119
+ "first_fold_task",
120
+ "first_fold_spec",
121
+ "first_fold_prd",
122
+ ])
123
+ assert.ok(
124
+ name === "zaip_aios_activities" ? names.has(name) : names.has(`zaip_vw_${name}`),
125
+ `missing ${name}`,
126
+ );
134
127
  assert.equal(names.has("zaip_vw_sub_runs"), true);
135
- for (const name of ["canonical_artifacts", "invocations", "invocation_usage", "work_items", "daily_aggregate_cache", "daily_aggregates", "overview", "overview_daily", "overview_monthly", "overview_annual", "operations_overview", "cost_monitor_overview", "cost_monitor_group_daily_cache", "cost_monitor_group_daily", "task_summary", "spec_summary", "prd_summary"]) assert.equal(objects.get(`zaip_vw_${name}`), "view", `${name} must be a prefixed view`);
136
- assert.equal([...objects.entries()].filter(([name, type]) => type === "view" && !name.startsWith("zaip_vw_")).length, 0, "all persisted views must use zaip_vw_");
137
- assert.equal([...objects.entries()].filter(([name, type]) => type === "view" && name.startsWith("zaip_vw_vw_")).length, 0, "view prefix must not be duplicated");
138
- assert.deepEqual([...objects.entries()].filter(([, type]) => type === "table").map(([name]) => name).sort(), ["cost_invocation_dimension_facts", "zaip_aios_activities", "zaip_dim_llm_model", "zaip_dim_provider", "zaip_dim_zaip_agent"]);
139
- const fact = database.prepare("SELECT activity_source_kind, agent_run_role, llm_call_count, provider, model, zaip_agent_persona, zaip_agent_job FROM zaip_aios_activities WHERE agent_run_id = ?").get("AINV-edge");
140
- assert.deepEqual({ ...fact }, { activity_source_kind: "agent_run", agent_run_role: "root", llm_call_count: 2, provider: "openai", model: "mixed", zaip_agent_persona: "ana", zaip_agent_job: "quality_engineer" });
141
- assert.equal(database.prepare("SELECT COUNT(*) AS count FROM zaip_aios_activities WHERE payload_type IS NULL").get().count, 3);
142
- assert.equal(database.prepare("SELECT COUNT(*) AS count FROM zaip_aios_activities WHERE payload_type IS NULL AND total_tokens IS NULL").get().count, 0);
143
- assert.equal(database.prepare("SELECT value FROM zaip_vw_read_model_metadata WHERE key='canonical_run_count'").get().value, "5");
144
- assert.equal(database.prepare("SELECT value FROM zaip_vw_read_model_metadata WHERE key='unassisted_activity_count'").get().value, "0");
145
- assert.equal(database.prepare("SELECT value FROM zaip_vw_read_model_metadata WHERE key='excluded_unknown_token_run_count'").get().value, "2");
146
- assert.equal(database.prepare("SELECT COUNT(*) AS count FROM zaip_vw_files WHERE path LIKE '.agents/records/lifecycle/%'").get().count, 0);
147
- assert.equal(database.prepare("SELECT llm_call_count FROM zaip_vw_daily_aggregates WHERE day = ?").get("2026-07-31").llm_call_count, 2);
148
- assert.equal(database.prepare("SELECT llm_call_count FROM zaip_vw_overview WHERE period_kind = 'month' AND period_key = '2026-08'").get().llm_call_count, 4);
149
- const dictionary = await readFile(join(root, ".agents/dashboard/DATA-DICTIONARY.md"), "utf8");
128
+ for (const name of [
129
+ "canonical_artifacts",
130
+ "invocations",
131
+ "invocation_usage",
132
+ "work_items",
133
+ "daily_aggregate_cache",
134
+ "daily_aggregates",
135
+ "overview",
136
+ "overview_daily",
137
+ "overview_monthly",
138
+ "overview_annual",
139
+ "operations_overview",
140
+ "cost_monitor_overview",
141
+ "cost_monitor_group_daily_cache",
142
+ "cost_monitor_group_daily",
143
+ "task_summary",
144
+ "spec_summary",
145
+ "prd_summary",
146
+ ])
147
+ assert.equal(objects.get(`zaip_vw_${name}`), "view", `${name} must be a prefixed view`);
148
+ assert.equal(
149
+ [...objects.entries()].filter(
150
+ ([name, type]) => type === "view" && !name.startsWith("zaip_vw_"),
151
+ ).length,
152
+ 0,
153
+ "all persisted views must use zaip_vw_",
154
+ );
155
+ assert.equal(
156
+ [...objects.entries()].filter(
157
+ ([name, type]) => type === "view" && name.startsWith("zaip_vw_vw_"),
158
+ ).length,
159
+ 0,
160
+ "view prefix must not be duplicated",
161
+ );
162
+ assert.deepEqual(
163
+ [...objects.entries()]
164
+ .filter(([, type]) => type === "table")
165
+ .map(([name]) => name)
166
+ .sort(),
167
+ [
168
+ "cost_invocation_dimension_facts",
169
+ "zaip_aios_activities",
170
+ "zaip_dim_llm_model",
171
+ "zaip_dim_provider",
172
+ "zaip_dim_zaip_agent",
173
+ ],
174
+ );
175
+ const fact = database
176
+ .prepare(
177
+ "SELECT activity_source_kind, agent_run_role, llm_call_count, provider, model, zaip_agent_persona, zaip_agent_job FROM zaip_aios_activities WHERE agent_run_id = ?",
178
+ )
179
+ .get("AINV-edge");
180
+ assert.deepEqual(
181
+ { ...fact },
182
+ {
183
+ activity_source_kind: "agent_run",
184
+ agent_run_role: "root",
185
+ llm_call_count: 2,
186
+ provider: "openai",
187
+ model: "mixed",
188
+ zaip_agent_persona: "ana",
189
+ zaip_agent_job: "quality_engineer",
190
+ },
191
+ );
192
+ assert.equal(
193
+ database
194
+ .prepare(
195
+ "SELECT COUNT(*) AS count FROM zaip_aios_activities WHERE payload_type IS NULL",
196
+ )
197
+ .get().count,
198
+ 3,
199
+ );
200
+ assert.equal(
201
+ database
202
+ .prepare(
203
+ "SELECT COUNT(*) AS count FROM zaip_aios_activities WHERE payload_type IS NULL AND total_tokens IS NULL",
204
+ )
205
+ .get().count,
206
+ 0,
207
+ );
208
+ assert.equal(
209
+ database
210
+ .prepare(
211
+ "SELECT value FROM zaip_vw_read_model_metadata WHERE key='canonical_run_count'",
212
+ )
213
+ .get().value,
214
+ "5",
215
+ );
216
+ assert.equal(
217
+ database
218
+ .prepare(
219
+ "SELECT value FROM zaip_vw_read_model_metadata WHERE key='unassisted_activity_count'",
220
+ )
221
+ .get().value,
222
+ "0",
223
+ );
224
+ assert.equal(
225
+ database
226
+ .prepare(
227
+ "SELECT value FROM zaip_vw_read_model_metadata WHERE key='excluded_unknown_token_run_count'",
228
+ )
229
+ .get().value,
230
+ "2",
231
+ );
232
+ assert.equal(
233
+ database
234
+ .prepare(
235
+ "SELECT COUNT(*) AS count FROM zaip_vw_files WHERE path LIKE '.agents/records/lifecycle/%'",
236
+ )
237
+ .get().count,
238
+ 0,
239
+ );
240
+ assert.equal(
241
+ database
242
+ .prepare("SELECT llm_call_count FROM zaip_vw_daily_aggregates WHERE day = ?")
243
+ .get("2026-07-31").llm_call_count,
244
+ 2,
245
+ );
246
+ assert.equal(
247
+ database
248
+ .prepare(
249
+ "SELECT llm_call_count FROM zaip_vw_overview WHERE period_kind = 'month' AND period_key = '2026-08'",
250
+ )
251
+ .get().llm_call_count,
252
+ 4,
253
+ );
254
+ const dictionary = await readFile(
255
+ join(root, ".agents/dashboard/DATA-DICTIONARY.md"),
256
+ "utf8",
257
+ );
150
258
  const headings = [...dictionary.matchAll(/^### `([^`]+)`\r?$/gm)];
151
- const sections = new Map(headings.map((heading, index) => [heading[1], dictionary.slice(heading.index, index + 1 < headings.length ? headings[index + 1].index : dictionary.length)]));
152
- for (const { name, type } of database.prepare("SELECT name, type FROM sqlite_master WHERE type IN ('table', 'view') AND name NOT LIKE 'sqlite_%'").all()) {
153
- const section = sections.get(name.startsWith("zaip_vw_") ? name.slice("zaip_vw_".length) : name);
259
+ const sections = new Map(
260
+ headings.map((heading, index) => [
261
+ heading[1],
262
+ dictionary.slice(
263
+ heading.index,
264
+ index + 1 < headings.length ? headings[index + 1].index : dictionary.length,
265
+ ),
266
+ ]),
267
+ );
268
+ for (const { name, type } of database
269
+ .prepare(
270
+ "SELECT name, type FROM sqlite_master WHERE type IN ('table', 'view') AND name NOT LIKE 'sqlite_%'",
271
+ )
272
+ .all()) {
273
+ const section = sections.get(
274
+ name.startsWith("zaip_vw_") ? name.slice("zaip_vw_".length) : name,
275
+ );
154
276
  assert.ok(section, `DATA-DICTIONARY.md must document ${type} ${name}`);
155
277
  }
156
- } finally { database.close(); }
157
- assert.equal(filesystem.invocationTotals({ from: "2026-07-31T00:00:00Z", to: "2026-07-31T23:59:59Z" }).invocation_count, 1);
158
- assert.equal(filesystem.invocationCostRows({ from: "2026-07-31", to: "2026-07-31", providers: ["openai"] }).length, 1);
278
+ } finally {
279
+ database.close();
280
+ }
281
+ assert.equal(
282
+ filesystem.invocationTotals({ from: "2026-07-31T00:00:00Z", to: "2026-07-31T23:59:59Z" })
283
+ .invocation_count,
284
+ 1,
285
+ );
286
+ assert.equal(
287
+ filesystem.invocationCostRows({
288
+ from: "2026-07-31",
289
+ to: "2026-07-31",
290
+ providers: ["openai"],
291
+ }).length,
292
+ 1,
293
+ );
159
294
  const row = filesystem.invocationCostRows({ from: "2026-07-31", to: "2026-07-31" })[0];
160
- assert.equal(row.provider, "mixed"); assert.equal(row.model, "mixed");
161
- assert.equal(row.input_tokens, 7); assert.equal(row.cached_input_tokens, 1);
162
- assert.equal(row.output_tokens, 3); assert.equal(row.reasoning_tokens, 4);
163
- assert.equal(row.total_tokens, 15); assert.equal(row.cost_brl, 10);
164
- assert.equal(filesystem.invocationCostRows({ from: "2026-08-15", to: "2026-08-15" }).find((value) => value.agent_invocation_id === "AINV-unavailable"), undefined);
165
- const augustMonthly = filesystem.viewPage("cost_monitor_monthly", { from: "2026-08-11", to: "2026-08-31" });
166
- assert.equal(augustMonthly.total_count, 1); assert.equal(augustMonthly.rows[0].period_key, "2026-08"); assert.equal(augustMonthly.rows[0].invocation_count, 1); assert.equal(augustMonthly.rows[0].total_duration, 300); assert.equal(augustMonthly.rows[0].total_tokens, 15); assert.equal(augustMonthly.rows[0].total_cost_brl, 10);
167
- const augustAnnual = filesystem.viewPage("cost_monitor_annual", { from: "2026-08-11", to: "2026-08-31" });
168
- assert.equal(augustAnnual.total_count, 1); assert.equal(augustAnnual.rows[0].period_key, "2026"); assert.equal(augustAnnual.rows[0].invocation_count, 1); assert.equal(augustAnnual.rows[0].total_duration, 300); assert.equal(augustAnnual.rows[0].total_tokens, 15); assert.equal(augustAnnual.rows[0].total_cost_brl, 10);
295
+ assert.equal(row.provider, "mixed");
296
+ assert.equal(row.model, "mixed");
297
+ assert.equal(row.input_tokens, 7);
298
+ assert.equal(row.cached_input_tokens, 1);
299
+ assert.equal(row.output_tokens, 3);
300
+ assert.equal(row.reasoning_tokens, 4);
301
+ assert.equal(row.total_tokens, 15);
302
+ assert.equal(row.cost_brl, 10);
303
+ assert.equal(
304
+ filesystem
305
+ .invocationCostRows({ from: "2026-08-15", to: "2026-08-15" })
306
+ .find((value) => value.agent_invocation_id === "AINV-unavailable"),
307
+ undefined,
308
+ );
309
+ const augustMonthly = filesystem.viewPage("cost_monitor_monthly", {
310
+ from: "2026-08-11",
311
+ to: "2026-08-31",
312
+ });
313
+ assert.equal(augustMonthly.total_count, 1);
314
+ assert.equal(augustMonthly.rows[0].period_key, "2026-08");
315
+ assert.equal(augustMonthly.rows[0].invocation_count, 1);
316
+ assert.equal(augustMonthly.rows[0].total_duration, 300);
317
+ assert.equal(augustMonthly.rows[0].total_tokens, 15);
318
+ assert.equal(augustMonthly.rows[0].total_cost_brl, 10);
319
+ const augustAnnual = filesystem.viewPage("cost_monitor_annual", {
320
+ from: "2026-08-11",
321
+ to: "2026-08-31",
322
+ });
323
+ assert.equal(augustAnnual.total_count, 1);
324
+ assert.equal(augustAnnual.rows[0].period_key, "2026");
325
+ assert.equal(augustAnnual.rows[0].invocation_count, 1);
326
+ assert.equal(augustAnnual.rows[0].total_duration, 300);
327
+ assert.equal(augustAnnual.rows[0].total_tokens, 15);
328
+ assert.equal(augustAnnual.rows[0].total_cost_brl, 10);
169
329
  // This fixture spans the Sao Paulo months 2026-07 and 2026-08.
170
- const monthly2026 = filesystem.viewPage("cost_monitor_monthly", { limit: 50, offset: 0 }).rows.filter((row) => String(row.key ?? row.period_key).startsWith("2026-"));
330
+ const monthly2026 = filesystem
331
+ .viewPage("cost_monitor_monthly", { limit: 50, offset: 0 })
332
+ .rows.filter((row) => String(row.key ?? row.period_key).startsWith("2026-"));
171
333
  const annual2026 = filesystem.viewPage("cost_monitor_annual", { limit: 50, offset: 0 });
172
334
  assert.equal(monthly2026.length >= 2, true);
173
335
  assert.equal(annual2026.total_count, 1);
174
336
  assert.equal(annual2026.rows[0].key ?? annual2026.rows[0].period_key, "2026");
175
- for (const metric of ["prd_count", "spec_count", "task_count", "validation_count", "evidence_count", "total_run_count", "total_duration", "total_tokens", "total_cost_usd", "total_cost_brl"]) {
337
+ for (const metric of [
338
+ "prd_count",
339
+ "spec_count",
340
+ "task_count",
341
+ "validation_count",
342
+ "evidence_count",
343
+ "total_run_count",
344
+ "total_duration",
345
+ "total_tokens",
346
+ "total_cost_usd",
347
+ "total_cost_brl",
348
+ ]) {
176
349
  const sum = monthly2026.reduce((total, row) => total + Number(row[metric] ?? 0), 0);
177
- assert.equal(Number(annual2026.rows[0][metric] ?? 0), sum, `annual ${metric} must equal the monthly sum`);
350
+ assert.equal(
351
+ Number(annual2026.rows[0][metric] ?? 0),
352
+ sum,
353
+ `annual ${metric} must equal the monthly sum`,
354
+ );
178
355
  }
179
- const completedAugust = filesystem.viewPage("cost_monitor_monthly", { from: "2026-08-11", to: "2026-08-31", status: "completed" });
180
- assert.equal(completedAugust.total_count, 1); assert.equal(completedAugust.rows[0].invocation_count, 1); assert.equal(completedAugust.rows[0].total_duration, 300);
181
- const failedAugust = filesystem.viewPage("cost_monitor_monthly", { from: "2026-08-11", to: "2026-08-31", status: "failed", agent: "agent-b", phase: "conversation" });
182
- assert.equal(failedAugust.total_count, 1); assert.equal(failedAugust.rows[0].invocation_count, 0); assert.equal(failedAugust.rows[0].total_run_count, 0); assert.equal(failedAugust.rows[0].total_duration, null);
183
- const filteredAnnual = filesystem.viewPage("cost_monitor_annual", { from: "2026-08-11", to: "2026-08-31", query: "AINV-aug-inside", provider: "openai", model: "a", agent: "agent-a", phase: "execution", status: "completed" });
184
- assert.equal(filteredAnnual.total_count, 1); assert.equal(filteredAnnual.rows[0].invocation_count, 1); assert.equal(filteredAnnual.rows[0].total_duration, 300);
185
- const filteredCalls = filesystem.viewPage("cost_monitor_agent_invocations", { from: "2026-07-31", to: "2026-07-31", query: "edge", agent: "agent-a", phase: "execution", status: "completed" });
186
- assert.equal(filteredCalls.total_count, 1); assert.equal(filteredCalls.rows[0].agent_invocation_id, "AINV-edge");
187
- assert.equal(filesystem.viewPage("cost_monitor_agent_invocations", { from: "2026-07-31", to: "2026-07-31", status: "failed" }).total_count, 0);
188
- const operationCalls = filesystem.viewPage("operations_agent_invocations", { query: "edge", status: "completed", agent: "agent-a", phase: "execution" });
356
+ const completedAugust = filesystem.viewPage("cost_monitor_monthly", {
357
+ from: "2026-08-11",
358
+ to: "2026-08-31",
359
+ status: "completed",
360
+ });
361
+ assert.equal(completedAugust.total_count, 1);
362
+ assert.equal(completedAugust.rows[0].invocation_count, 1);
363
+ assert.equal(completedAugust.rows[0].total_duration, 300);
364
+ const failedAugust = filesystem.viewPage("cost_monitor_monthly", {
365
+ from: "2026-08-11",
366
+ to: "2026-08-31",
367
+ status: "failed",
368
+ agent: "agent-b",
369
+ phase: "conversation",
370
+ });
371
+ assert.equal(failedAugust.total_count, 1);
372
+ assert.equal(failedAugust.rows[0].invocation_count, 0);
373
+ assert.equal(failedAugust.rows[0].total_run_count, 0);
374
+ assert.equal(failedAugust.rows[0].total_duration, null);
375
+ const filteredAnnual = filesystem.viewPage("cost_monitor_annual", {
376
+ from: "2026-08-11",
377
+ to: "2026-08-31",
378
+ query: "AINV-aug-inside",
379
+ provider: "openai",
380
+ model: "a",
381
+ agent: "agent-a",
382
+ phase: "execution",
383
+ status: "completed",
384
+ });
385
+ assert.equal(filteredAnnual.total_count, 1);
386
+ assert.equal(filteredAnnual.rows[0].invocation_count, 1);
387
+ assert.equal(filteredAnnual.rows[0].total_duration, 300);
388
+ const filteredCalls = filesystem.viewPage("cost_monitor_agent_invocations", {
389
+ from: "2026-07-31",
390
+ to: "2026-07-31",
391
+ query: "edge",
392
+ agent: "agent-a",
393
+ phase: "execution",
394
+ status: "completed",
395
+ });
396
+ assert.equal(filteredCalls.total_count, 1);
397
+ assert.equal(filteredCalls.rows[0].agent_invocation_id, "AINV-edge");
398
+ assert.equal(
399
+ filesystem.viewPage("cost_monitor_agent_invocations", {
400
+ from: "2026-07-31",
401
+ to: "2026-07-31",
402
+ status: "failed",
403
+ }).total_count,
404
+ 0,
405
+ );
406
+ const operationCalls = filesystem.viewPage("operations_agent_invocations", {
407
+ query: "edge",
408
+ status: "completed",
409
+ agent: "agent-a",
410
+ phase: "execution",
411
+ });
189
412
  assert.equal(operationCalls.total_count, 1);
190
- const operationExecutions = filesystem.viewPage("operations_executions", { query: "EXEC-a", status: "completed" });
413
+ const operationExecutions = filesystem.viewPage("operations_executions", {
414
+ query: "EXEC-a",
415
+ status: "completed",
416
+ });
191
417
  assert.equal(operationExecutions.total_count, 1);
192
- assert.equal(filesystem.viewPage("operations_changes", { query: "edge", status: "active" }).total_count, 0);
193
- assert.equal(filesystem.viewPage("operations_decisions", { query: "edge", status: "accepted" }).total_count, 0);
194
- assert.equal(filesystem.viewPage("cost_monitor_monthly", { from: "2026-08-11", to: "2026-08-31", query: "AINV-unavailable" }).total_count, 0);
418
+ assert.equal(
419
+ filesystem.viewPage("operations_changes", { query: "edge", status: "active" }).total_count,
420
+ 0,
421
+ );
422
+ assert.equal(
423
+ filesystem.viewPage("operations_decisions", { query: "edge", status: "accepted" })
424
+ .total_count,
425
+ 0,
426
+ );
427
+ assert.equal(
428
+ filesystem.viewPage("cost_monitor_monthly", {
429
+ from: "2026-08-11",
430
+ to: "2026-08-31",
431
+ query: "AINV-unavailable",
432
+ }).total_count,
433
+ 0,
434
+ );
195
435
  for (const groupedView of ["cost_monitor_providers", "cost_monitor_models"]) {
196
- const grouped = filesystem.viewPage(groupedView, { from: "2026-07-31", to: "2026-07-31", provider: "openai", model: "a", agent: "agent-a", phase: "execution", status: "completed", limit: 50 });
436
+ const grouped = filesystem.viewPage(groupedView, {
437
+ from: "2026-07-31",
438
+ to: "2026-07-31",
439
+ provider: "openai",
440
+ model: "a",
441
+ agent: "agent-a",
442
+ phase: "execution",
443
+ status: "completed",
444
+ limit: 50,
445
+ });
197
446
  const mixed = grouped.rows.find((row) => row.key === "mixed");
198
- assert.ok(mixed); assert.equal(mixed.total_duration, 100);
447
+ assert.ok(mixed);
448
+ assert.equal(mixed.total_duration, 100);
199
449
  }
200
- const agentGroups = filesystem.viewPage("cost_monitor_zaip_agents", { from: "2026-07-31", to: "2026-07-31", provider: "openai", model: "a", phase: "execution", status: "completed" });
201
- assert.equal(agentGroups.total_count, 1); assert.equal(agentGroups.rows[0].key, "agent-a"); assert.equal(agentGroups.rows[0].invocation_count, 1);
450
+ const agentGroups = filesystem.viewPage("cost_monitor_zaip_agents", {
451
+ from: "2026-07-31",
452
+ to: "2026-07-31",
453
+ provider: "openai",
454
+ model: "a",
455
+ phase: "execution",
456
+ status: "completed",
457
+ });
458
+ assert.equal(agentGroups.total_count, 1);
459
+ assert.equal(agentGroups.rows[0].key, "agent-a");
460
+ assert.equal(agentGroups.rows[0].invocation_count, 1);
202
461
  const overview = filesystem.overviewPage("day", 0, 50);
203
462
  assert.equal(overview.total, 4);
204
- assert.equal(overview.rows.reduce((count, value) => count + Number(value.invocation_count), 0), 3);
205
- for (const view of Object.keys(runtime.sqliteViewMetadata)) assert.ok(filesystem.viewPage(view, { limit: 1 }).rows.length <= 1, `view page ${view}`);
463
+ assert.equal(
464
+ overview.rows.reduce((count, value) => count + Number(value.invocation_count), 0),
465
+ 3,
466
+ );
467
+ for (const view of Object.keys(runtime.sqliteViewMetadata))
468
+ assert.ok(filesystem.viewPage(view, { limit: 1 }).rows.length <= 1, `view page ${view}`);
206
469
  assert.equal(filesystem.viewPage("first_fold_top_tasks", {}).limit, 5);
207
470
  assert.equal(filesystem.viewPage("cost_monitor_agent_invocations", {}).limit, 100);
208
471
  const planDatabase = new DatabaseSync(process.env.ZAIP_SQLITE_DB_PATH, { readOnly: true });
209
472
  try {
210
- const plan = planDatabase.prepare("EXPLAIN QUERY PLAN SELECT agent_run_id FROM zaip_aios_activities WHERE activity_source_kind=? AND occurred_day_sp>=? AND occurred_day_sp<=?").all("agent_run", "2026-07-31", "2026-08-31");
473
+ const plan = planDatabase
474
+ .prepare(
475
+ "EXPLAIN QUERY PLAN SELECT agent_run_id FROM zaip_aios_activities WHERE activity_source_kind=? AND occurred_day_sp>=? AND occurred_day_sp<=?",
476
+ )
477
+ .all("agent_run", "2026-07-31", "2026-08-31");
211
478
  assert.match(plan.map((value) => value.detail).join(" "), /zaip_activities_agent_run/);
212
- } finally { planDatabase.close(); }
479
+ } finally {
480
+ planDatabase.close();
481
+ }
482
+ }
483
+ } finally {
484
+ try {
485
+ filesystem.close();
486
+ } catch {
487
+ /* fixture may already be closed */
213
488
  }
214
- } finally { try { filesystem.close(); } catch { /* fixture may already be closed */ } }
489
+ }
215
490
  }
216
491
 
217
492
  const canonicalDb = process.env.ZAIP_SQLITE_DB_PATH;
@@ -219,25 +494,65 @@ const runtimeBundle = await loadReadModelRuntime();
219
494
  const adapterBundle = await loadCostAdapterRuntime();
220
495
  const canonicalTestDirectory = await createSqliteTestDirectory("canonical-");
221
496
  try {
222
- assert.equal(adapterBundle.runtime.costGroupDuration({ cost_monitor_total_duration: null }), null);
223
- assert.equal(adapterBundle.runtime.costGroupDuration({ total_duration: null, cost_monitor_total_duration: 999 }), null);
224
- assert.deepEqual(adapterBundle.runtime.legacyKnownMetric(null), { known_sum: 0, unknown: 1, complete: false, coverage_ratio: 0 });
225
- assert.deepEqual(adapterBundle.runtime.legacyKnownMetric(0), { known_sum: 0, unknown: 0, complete: true, coverage_ratio: 1 });
497
+ assert.equal(
498
+ adapterBundle.runtime.costGroupDuration({ cost_monitor_total_duration: null }),
499
+ null,
500
+ );
501
+ assert.equal(
502
+ adapterBundle.runtime.costGroupDuration({
503
+ total_duration: null,
504
+ cost_monitor_total_duration: 999,
505
+ }),
506
+ null,
507
+ );
508
+ assert.deepEqual(adapterBundle.runtime.legacyKnownMetric(null), {
509
+ known_sum: 0,
510
+ unknown: 1,
511
+ complete: false,
512
+ coverage_ratio: 0,
513
+ });
514
+ assert.deepEqual(adapterBundle.runtime.legacyKnownMetric(0), {
515
+ known_sum: 0,
516
+ unknown: 0,
517
+ complete: true,
518
+ coverage_ratio: 1,
519
+ });
226
520
  process.env.ZAIP_SQLITE_DB_PATH = join(canonicalTestDirectory, "read-model.sqlite");
227
521
  await verify(runtimeBundle.runtime, root, [[null, null]]);
228
522
  const liveDatabase = new DatabaseSync(process.env.ZAIP_SQLITE_DB_PATH, { readOnly: true });
229
523
  try {
230
524
  const daily = liveDatabase
231
- .prepare("SELECT day, total_duration FROM zaip_vw_daily_aggregates WHERE day IN ('2026-07-22', '2026-07-23') ORDER BY day")
525
+ .prepare(
526
+ "SELECT day, total_duration FROM zaip_vw_daily_aggregates WHERE day IN ('2026-07-22', '2026-07-23') ORDER BY day",
527
+ )
232
528
  .all();
233
529
  const byDay = new Map(daily.map((row) => [row.day, row.total_duration]));
234
- assert.ok((byDay.get("2026-07-22") ?? 0) >= 100 * 60_000, "2026-07-22 must retain roughly 103 measurable minutes");
235
- assert.ok((byDay.get("2026-07-22") ?? 0) <= 106 * 60_000, "2026-07-22 must not exceed its reconciled interval union");
236
- assert.ok((byDay.get("2026-07-23") ?? 0) >= 61 * 60_000, "2026-07-23 must retain at least 61 measurable minutes");
237
- assert.equal(liveDatabase.prepare("SELECT COUNT(*) AS count FROM zaip_vw_daily_aggregates WHERE total_duration > 86400000").get().count, 0, "daily duration must not exceed 24 hours");
530
+ assert.ok(
531
+ (byDay.get("2026-07-22") ?? 0) >= 100 * 60_000,
532
+ "2026-07-22 must retain roughly 103 measurable minutes",
533
+ );
534
+ assert.ok(
535
+ (byDay.get("2026-07-22") ?? 0) <= 106 * 60_000,
536
+ "2026-07-22 must not exceed its reconciled interval union",
537
+ );
538
+ assert.ok(
539
+ (byDay.get("2026-07-23") ?? 0) >= 61 * 60_000,
540
+ "2026-07-23 must retain at least 61 measurable minutes",
541
+ );
542
+ assert.equal(
543
+ liveDatabase
544
+ .prepare(
545
+ "SELECT COUNT(*) AS count FROM zaip_vw_daily_aggregates WHERE total_duration > 86400000",
546
+ )
547
+ .get().count,
548
+ 0,
549
+ "daily duration must not exceed 24 hours",
550
+ );
238
551
  process.stdout.write(`SQLite live daily durations: ${JSON.stringify(daily)}\n`);
239
- } finally { liveDatabase.close(); }
240
- const temp = await fixture();
552
+ } finally {
553
+ liveDatabase.close();
554
+ }
555
+ const temp = await fixture(createSqliteTestDirectory);
241
556
  try {
242
557
  process.env.ZAIP_SQLITE_DB_PATH = join(temp, ".local/dashboard-sqlite/read-model.sqlite");
243
558
  const nested = join(temp, ".agents/records/tasks/nested/task.md");
@@ -249,10 +564,22 @@ try {
249
564
  await utimes(nested, changedAt, changedAt);
250
565
  await runtimeBundle.runtime.rebuildSqliteReadModel(temp);
251
566
  const changed = new runtimeBundle.runtime.SqliteReadModelFileSystem(temp);
252
- try { assert.match(await changed.readText(".agents/records/tasks/nested/task.md"), /after/); } finally { changed.close(); }
253
- await verify(runtimeBundle.runtime, temp, [[null, null], ["2026-08-15", "2026-08-15"], ["2026-08-16", "2026-08-16"]]);
254
- } finally { await rm(temp, { recursive: true, force: true }); }
255
- process.stdout.write("SQLite daily aggregate parity passed: canonical all-time/ranges plus known-zero and all-unknown/null fixture.\n");
567
+ try {
568
+ assert.match(await changed.readText(".agents/records/tasks/nested/task.md"), /after/);
569
+ } finally {
570
+ changed.close();
571
+ }
572
+ await verify(runtimeBundle.runtime, temp, [
573
+ [null, null],
574
+ ["2026-08-15", "2026-08-15"],
575
+ ["2026-08-16", "2026-08-16"],
576
+ ]);
577
+ } finally {
578
+ await rm(temp, { recursive: true, force: true });
579
+ }
580
+ process.stdout.write(
581
+ "SQLite daily aggregate parity passed: canonical all-time/ranges plus known-zero and all-unknown/null fixture.\n",
582
+ );
256
583
  } finally {
257
584
  await rm(runtimeBundle.directory, { recursive: true, force: true });
258
585
  await rm(adapterBundle.directory, { recursive: true, force: true });