@kontourai/flow-agents 0.1.1

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 (418) hide show
  1. package/.githooks/pre-push +11 -0
  2. package/.github/workflows/ci.yml +210 -0
  3. package/.github/workflows/docs-pages.yml +52 -0
  4. package/.github/workflows/publish-npm.yml +104 -0
  5. package/AGENTS.md +26 -0
  6. package/CHANGELOG.md +66 -0
  7. package/CODE_OF_CONDUCT.md +25 -0
  8. package/CONTEXT.md +300 -0
  9. package/CONTRIBUTING.md +44 -0
  10. package/LICENSE +201 -0
  11. package/README.md +129 -0
  12. package/SECURITY.md +33 -0
  13. package/agent-cards/dev.json +19 -0
  14. package/agents/dev.json +127 -0
  15. package/agents/tool-code-reviewer.json +61 -0
  16. package/agents/tool-dependencies-updater.json +118 -0
  17. package/agents/tool-explore-config.json +92 -0
  18. package/agents/tool-explore-deps.json +92 -0
  19. package/agents/tool-explore-entry.json +92 -0
  20. package/agents/tool-explore-patterns.json +92 -0
  21. package/agents/tool-explore-structure.json +92 -0
  22. package/agents/tool-explore-tests.json +92 -0
  23. package/agents/tool-planner.json +57 -0
  24. package/agents/tool-playwright.json +145 -0
  25. package/agents/tool-security-reviewer.json +56 -0
  26. package/agents/tool-verifier.json +61 -0
  27. package/agents/tool-worker.json +58 -0
  28. package/build/src/cli/console-learning-projection.js +123 -0
  29. package/build/src/cli/docs-preview.js +39 -0
  30. package/build/src/cli/effective-backlog-settings.js +102 -0
  31. package/build/src/cli/export-bookmarks.js +38 -0
  32. package/build/src/cli/fixture-retirement-audit.js +140 -0
  33. package/build/src/cli/flow-kit.js +138 -0
  34. package/build/src/cli/import-bookmarks.js +50 -0
  35. package/build/src/cli/init.js +239 -0
  36. package/build/src/cli/instinct-cli.js +93 -0
  37. package/build/src/cli/promote-workflow-artifact.js +63 -0
  38. package/build/src/cli/publish-change-helper.js +154 -0
  39. package/build/src/cli/pull-work-provider.js +469 -0
  40. package/build/src/cli/runtime-adapter.js +23 -0
  41. package/build/src/cli/telemetry-doctor.js +221 -0
  42. package/build/src/cli/usage-feedback.js +443 -0
  43. package/build/src/cli/validate-hook-influence.js +152 -0
  44. package/build/src/cli/validate-source-tree.js +31 -0
  45. package/build/src/cli/validate-workflow-artifacts.js +486 -0
  46. package/build/src/cli/veritas-governance.js +262 -0
  47. package/build/src/cli/workflow-artifact-cleanup-audit.js +272 -0
  48. package/build/src/cli/workflow-sidecar.js +816 -0
  49. package/build/src/cli.js +89 -0
  50. package/build/src/flow-kit/validate.js +75 -0
  51. package/build/src/lib/args.js +45 -0
  52. package/build/src/lib/fs.js +62 -0
  53. package/build/src/lib/workflow-learning-projection.js +334 -0
  54. package/build/src/runtime-adapters.js +146 -0
  55. package/build/src/tools/build-universal-bundles.js +397 -0
  56. package/build/src/tools/common.js +56 -0
  57. package/build/src/tools/filter-installed-packs.js +132 -0
  58. package/build/src/tools/generate-context-map.js +198 -0
  59. package/build/src/tools/validate-package.js +64 -0
  60. package/build/src/tools/validate-source-tree.js +622 -0
  61. package/console.telemetry.json +176 -0
  62. package/context/base-rules.md +17 -0
  63. package/context/code-review-standards.md +62 -0
  64. package/context/coding-standards.md +42 -0
  65. package/context/common/orchestrators.md +12 -0
  66. package/context/common/subagents.md +28 -0
  67. package/context/contracts/artifact-contract.md +182 -0
  68. package/context/contracts/builder-kit-workflow-state-contract.md +319 -0
  69. package/context/contracts/delivery-contract.md +69 -0
  70. package/context/contracts/execution-contract.md +53 -0
  71. package/context/contracts/governance-adapter-contract.md +67 -0
  72. package/context/contracts/planning-contract.md +85 -0
  73. package/context/contracts/review-contract.md +104 -0
  74. package/context/contracts/sandbox-policy.md +52 -0
  75. package/context/contracts/verification-contract.md +134 -0
  76. package/context/contracts/work-item-contract.md +215 -0
  77. package/context/deferred/demo-mode.md +33 -0
  78. package/context/deferred/languages/go.md +31 -0
  79. package/context/deferred/languages/python.md +31 -0
  80. package/context/deferred/languages/typescript.md +34 -0
  81. package/context/deferred/parallelization.md +35 -0
  82. package/context/deferred/worktree-isolation.md +24 -0
  83. package/context/development-workflow.md +50 -0
  84. package/context/scripts/context-budget/budget-scan.sh +166 -0
  85. package/context/scripts/detect-tools.sh +3 -0
  86. package/context/scripts/discover-agents.sh +28 -0
  87. package/context/scripts/git-status.sh +49 -0
  88. package/context/scripts/hooks/config-protection.js +79 -0
  89. package/context/scripts/hooks/desktop-notify.sh +39 -0
  90. package/context/scripts/hooks/governance-audit.sh +135 -0
  91. package/context/scripts/hooks/lib/audit-transport.sh +40 -0
  92. package/context/scripts/hooks/lib/hook-flags.js +49 -0
  93. package/context/scripts/hooks/lib/patterns.sh +57 -0
  94. package/context/scripts/hooks/lib/resolve-formatter.js +80 -0
  95. package/context/scripts/hooks/post-edit-accumulator.js +66 -0
  96. package/context/scripts/hooks/pre-commit-quality.js +194 -0
  97. package/context/scripts/hooks/quality-gate.js +93 -0
  98. package/context/scripts/hooks/report-only-guard.js +21 -0
  99. package/context/scripts/hooks/run-hook.js +136 -0
  100. package/context/scripts/hooks/stop-format-typecheck.js +141 -0
  101. package/context/scripts/hooks/stop-goal-fit.js +337 -0
  102. package/context/scripts/hooks/workflow-steering.js +250 -0
  103. package/context/scripts/telemetry/console-presets.sh +14 -0
  104. package/context/scripts/telemetry/install-console-config.sh +214 -0
  105. package/context/scripts/telemetry/lib/config.sh +85 -0
  106. package/context/scripts/telemetry/lib/enrich.sh +115 -0
  107. package/context/scripts/telemetry/lib/redact.sh +22 -0
  108. package/context/scripts/telemetry/lib/session.sh +63 -0
  109. package/context/scripts/telemetry/lib/transport.sh +183 -0
  110. package/context/scripts/telemetry/lib/usage.sh +29 -0
  111. package/context/scripts/telemetry/sync-agents.sh +173 -0
  112. package/context/scripts/telemetry/telemetry.conf +23 -0
  113. package/context/scripts/telemetry/telemetry.sh +387 -0
  114. package/context/scripts/validate-package.sh +89 -0
  115. package/context/settings/backlog-provider-settings.json +54 -0
  116. package/context/templates/core/identity.md +26 -0
  117. package/context/templates/core/user.md +15 -0
  118. package/docs/_config.yml +15 -0
  119. package/docs/_layouts/default.html +87 -0
  120. package/docs/adr/0001-flow-agents-consumes-flow.md +77 -0
  121. package/docs/adr/0002-flow-kits-as-extension-unit.md +13 -0
  122. package/docs/adr/0003-flow-agents-coordinates-kits-and-adapters.md +13 -0
  123. package/docs/adr/0004-gates-expect-surface-claims.md +15 -0
  124. package/docs/adr/0005-kubernetes-inspired-resource-contracts.md +48 -0
  125. package/docs/adr/0006-typescript-first-source-policy.md +98 -0
  126. package/docs/agent-system-guidebook.md +391 -0
  127. package/docs/agent-usage-feedback-loop.md +351 -0
  128. package/docs/assets/favicon.svg +13 -0
  129. package/docs/assets/og-image.png +0 -0
  130. package/docs/assets/site.css +774 -0
  131. package/docs/assets/site.js +139 -0
  132. package/docs/configurable-workflow-routing.md +174 -0
  133. package/docs/context-map.md +145 -0
  134. package/docs/developer-architecture.md +145 -0
  135. package/docs/developer-hook-setup.md +61 -0
  136. package/docs/fixture-ownership.md +44 -0
  137. package/docs/flow-kit-repository-contract.md +180 -0
  138. package/docs/index.md +129 -0
  139. package/docs/kontour-resource-contract.md +358 -0
  140. package/docs/migrations.md +64 -0
  141. package/docs/north-star.md +322 -0
  142. package/docs/operating-layers.md +110 -0
  143. package/docs/repository-structure.md +132 -0
  144. package/docs/sandbox-policy.md +56 -0
  145. package/docs/skills-map.md +203 -0
  146. package/docs/standards-register.md +96 -0
  147. package/docs/veritas-integration.md +165 -0
  148. package/docs/work-item-adapters.md +72 -0
  149. package/docs/workflow-artifact-lifecycle.md +141 -0
  150. package/docs/workflow-eval-strategy.md +295 -0
  151. package/docs/workflow-shared-contracts.md +51 -0
  152. package/docs/workflow-usage-guide.md +443 -0
  153. package/evals/ARCHITECTURE.md +143 -0
  154. package/evals/CONVENTIONS.md +58 -0
  155. package/evals/README.md +128 -0
  156. package/evals/acceptance/run.sh +29 -0
  157. package/evals/acceptance/test_claude_harness.sh +242 -0
  158. package/evals/acceptance/test_codex_harness.sh +108 -0
  159. package/evals/acceptance/test_kiro_harness.sh +128 -0
  160. package/evals/cases/dev/404.html +97 -0
  161. package/evals/cases/dev/code-review.yaml +44 -0
  162. package/evals/cases/dev/dashboard.html +300 -0
  163. package/evals/cases/dev/deliver.yaml +66 -0
  164. package/evals/cases/dev/dependency-update.yaml +16 -0
  165. package/evals/cases/dev/explore.yaml +20 -0
  166. package/evals/cases/dev/index.html +370 -0
  167. package/evals/cases/dev/package-lock.json +28 -0
  168. package/evals/cases/dev/package.json +16 -0
  169. package/evals/cases/dev/plan-work.yaml +20 -0
  170. package/evals/cases/dev/promptfooconfig.yaml +666 -0
  171. package/evals/cases/dev/search-first.yaml +20 -0
  172. package/evals/cases/dev/tdd-workflow.yaml +48 -0
  173. package/evals/cases/dev/verify-work.yaml +44 -0
  174. package/evals/cases/dev/workflow.yaml +34 -0
  175. package/evals/ci/run-baseline.sh +283 -0
  176. package/evals/fixtures/backlog-provider-settings/global-default.json +44 -0
  177. package/evals/fixtures/backlog-provider-settings/project-override.json +53 -0
  178. package/evals/fixtures/builder-kit-workflow-state/baseline-freshness-resolution-hint.json +139 -0
  179. package/evals/fixtures/builder-kit-workflow-state/direct-primitive-stop.json +59 -0
  180. package/evals/fixtures/builder-kit-workflow-state/empty-board-route-shape.json +55 -0
  181. package/evals/fixtures/builder-kit-workflow-state/happy-path.json +71 -0
  182. package/evals/fixtures/builder-kit-workflow-state/mid-work-resume.json +80 -0
  183. package/evals/fixtures/builder-kit-workflow-state/missing-prestep-recovery.json +65 -0
  184. package/evals/fixtures/builder-kit-workflow-state/product-build-chaining.json +60 -0
  185. package/evals/fixtures/builder-kit-workflow-state/stale-continuation-requires-new-probe.json +57 -0
  186. package/evals/fixtures/console-learning-projection/artifacts/console-learning-correction/learning.json +50 -0
  187. package/evals/fixtures/console-learning-projection/artifacts/console-learning-open-route/learning.json +41 -0
  188. package/evals/fixtures/flow-kit-repository/invalid-absolute-path/kit.json +8 -0
  189. package/evals/fixtures/flow-kit-repository/invalid-asset-section/flows/review.flow.json +6 -0
  190. package/evals/fixtures/flow-kit-repository/invalid-asset-section/kit.json +11 -0
  191. package/evals/fixtures/flow-kit-repository/invalid-duplicate-flow/flows/review.flow.json +6 -0
  192. package/evals/fixtures/flow-kit-repository/invalid-duplicate-flow/kit.json +9 -0
  193. package/evals/fixtures/flow-kit-repository/invalid-id/flows/review.flow.json +6 -0
  194. package/evals/fixtures/flow-kit-repository/invalid-id/kit.json +8 -0
  195. package/evals/fixtures/flow-kit-repository/invalid-malformed-json/kit.json +8 -0
  196. package/evals/fixtures/flow-kit-repository/invalid-missing-flow/kit.json +8 -0
  197. package/evals/fixtures/flow-kit-repository/invalid-missing-id/flows/review.flow.json +6 -0
  198. package/evals/fixtures/flow-kit-repository/invalid-missing-id/kit.json +7 -0
  199. package/evals/fixtures/flow-kit-repository/invalid-missing-schema-version/flows/review.flow.json +6 -0
  200. package/evals/fixtures/flow-kit-repository/invalid-missing-schema-version/kit.json +7 -0
  201. package/evals/fixtures/flow-kit-repository/invalid-name/flows/review.flow.json +6 -0
  202. package/evals/fixtures/flow-kit-repository/invalid-name/kit.json +8 -0
  203. package/evals/fixtures/flow-kit-repository/invalid-schema-version/flows/review.flow.json +6 -0
  204. package/evals/fixtures/flow-kit-repository/invalid-schema-version/kit.json +8 -0
  205. package/evals/fixtures/flow-kit-repository/invalid-traversal/kit.json +8 -0
  206. package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/adapters/example.json +3 -0
  207. package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/assets/example.txt +1 -0
  208. package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/docs/README.md +3 -0
  209. package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/flows/runtime.flow.json +26 -0
  210. package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/kit-evals/example.json +3 -0
  211. package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/kit-skills/mixed/SKILL.md +3 -0
  212. package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/kit.json +44 -0
  213. package/evals/fixtures/flow-kit-repository/valid-local-kit/docs/README.md +3 -0
  214. package/evals/fixtures/flow-kit-repository/valid-local-kit/flows/review.flow.json +26 -0
  215. package/evals/fixtures/flow-kit-repository/valid-local-kit/kit.json +20 -0
  216. package/evals/fixtures/hook-influence/cases.json +336 -0
  217. package/evals/fixtures/pull-work-provider/github-issues.json +170 -0
  218. package/evals/fixtures/pull-work-wip-shepherding/global-wip-informs.json +43 -0
  219. package/evals/fixtures/pull-work-wip-shepherding/personal-wip-blocks.json +42 -0
  220. package/evals/fixtures/surface-trust/accepted-claim-trust-report.json +31 -0
  221. package/evals/fixtures/surface-trust/artifact-absent.json +19 -0
  222. package/evals/fixtures/surface-trust/integrity-mismatch-trust-report.json +32 -0
  223. package/evals/fixtures/surface-trust/missing-authority-trust-report.json +27 -0
  224. package/evals/fixtures/surface-trust/provider-absent.json +19 -0
  225. package/evals/fixtures/surface-trust/rejected-claim-trust-report.json +30 -0
  226. package/evals/fixtures/surface-trust/stale-claim-trust-snapshot.json +31 -0
  227. package/evals/fixtures/usage-feedback/sample-full.jsonl +11 -0
  228. package/evals/fixtures/usage-feedback/sample-outcomes.jsonl +1 -0
  229. package/evals/fixtures/veritas-governance-adapter/fake-veritas-pass.sh +18 -0
  230. package/evals/fixtures/veritas-governance-adapter/fake-veritas-secret-fail.sh +10 -0
  231. package/evals/fixtures/veritas-governance-adapter/fake-veritas-unconfigured.sh +4 -0
  232. package/evals/integration/test_bundle_install.sh +541 -0
  233. package/evals/integration/test_console_learning_projection.sh +192 -0
  234. package/evals/integration/test_context_map.sh +65 -0
  235. package/evals/integration/test_effective_backlog_settings.sh +58 -0
  236. package/evals/integration/test_fixture_retirement_audit.sh +58 -0
  237. package/evals/integration/test_flow_agents_statusline.sh +93 -0
  238. package/evals/integration/test_flow_kit_repository.sh +90 -0
  239. package/evals/integration/test_goal_fit_hook.sh +482 -0
  240. package/evals/integration/test_hook_category_behaviors.sh +190 -0
  241. package/evals/integration/test_hook_influence_cases.sh +69 -0
  242. package/evals/integration/test_local_flow_kit_install.sh +145 -0
  243. package/evals/integration/test_publish_change_helper.sh +176 -0
  244. package/evals/integration/test_pull_work_provider.sh +140 -0
  245. package/evals/integration/test_runtime_adapter_activation.sh +106 -0
  246. package/evals/integration/test_telemetry.sh +485 -0
  247. package/evals/integration/test_telemetry_doctor.sh +193 -0
  248. package/evals/integration/test_usage_feedback_dashboard.sh +169 -0
  249. package/evals/integration/test_usage_feedback_global.sh +117 -0
  250. package/evals/integration/test_usage_feedback_import.sh +227 -0
  251. package/evals/integration/test_usage_feedback_outcomes.sh +165 -0
  252. package/evals/integration/test_usage_feedback_report.sh +263 -0
  253. package/evals/integration/test_veritas_governance_adapter.sh +235 -0
  254. package/evals/integration/test_workflow_artifact_cleanup_audit.sh +287 -0
  255. package/evals/integration/test_workflow_artifacts.sh +1247 -0
  256. package/evals/integration/test_workflow_sidecar_writer.sh +2112 -0
  257. package/evals/integration/test_workflow_steering_hook.sh +337 -0
  258. package/evals/lib/assertions/delegated-to.js +40 -0
  259. package/evals/lib/assertions/max-tool-calls.js +15 -0
  260. package/evals/lib/assertions/no-write-tools.js +27 -0
  261. package/evals/lib/assertions/pass-at-k.js +39 -0
  262. package/evals/lib/assertions/telemetry-utils.js +105 -0
  263. package/evals/lib/assertions/tool-called.js +39 -0
  264. package/evals/lib/assertions/verify-after-fix.js +61 -0
  265. package/evals/lib/claude-judge.sh +40 -0
  266. package/evals/lib/claude-provider.sh +74 -0
  267. package/evals/lib/codex-judge.sh +39 -0
  268. package/evals/lib/codex-provider.sh +81 -0
  269. package/evals/lib/eval-dev.sh +5 -0
  270. package/evals/lib/eval-judge.sh +22 -0
  271. package/evals/lib/eval-provider.sh +26 -0
  272. package/evals/lib/eval-report.sh +73 -0
  273. package/evals/lib/kiro-dev.sh +4 -0
  274. package/evals/lib/kiro-judge.sh +17 -0
  275. package/evals/lib/kiro-provider.sh +62 -0
  276. package/evals/lib/node.sh +111 -0
  277. package/evals/promptfooconfig.yaml +70 -0
  278. package/evals/run.sh +309 -0
  279. package/evals/static/test_evidence_refs.sh +141 -0
  280. package/evals/static/test_package.sh +407 -0
  281. package/evals/static/test_repo_hooks.sh +68 -0
  282. package/evals/static/test_universal_bundles.sh +274 -0
  283. package/evals/static/test_workflow_skills.sh +1207 -0
  284. package/install.sh +64 -0
  285. package/integrations/veritas/flow-agents.adapter.json +138 -0
  286. package/integrations/veritas/flow-agents.authority-settings.json +26 -0
  287. package/integrations/veritas/flow-agents.repo-standards.json +82 -0
  288. package/kits/builder/flows/build.flow.json +218 -0
  289. package/kits/builder/flows/shape.flow.json +127 -0
  290. package/kits/builder/kit.json +19 -0
  291. package/kits/catalog.json +11 -0
  292. package/package.json +130 -0
  293. package/packaging/README.md +60 -0
  294. package/packaging/manifest.json +173 -0
  295. package/packaging/packs.json +69 -0
  296. package/powers/dependency-checker/POWER.md +20 -0
  297. package/powers/dependency-checker/mcp.json +20 -0
  298. package/powers/playwright/POWER.md +25 -0
  299. package/powers/playwright/mcp.json +12 -0
  300. package/prompts/code-audit.md +123 -0
  301. package/prompts/kcommit.md +88 -0
  302. package/schemas/backlog-provider-settings.schema.json +138 -0
  303. package/schemas/workflow-acceptance.schema.json +216 -0
  304. package/schemas/workflow-critique.schema.json +113 -0
  305. package/schemas/workflow-evidence.schema.json +357 -0
  306. package/schemas/workflow-handoff.schema.json +52 -0
  307. package/schemas/workflow-learning.schema.json +223 -0
  308. package/schemas/workflow-release.schema.json +172 -0
  309. package/schemas/workflow-state.schema.json +80 -0
  310. package/scripts/README.md +111 -0
  311. package/scripts/build-universal-bundles.js +3 -0
  312. package/scripts/check-content-boundary.cjs +99 -0
  313. package/scripts/context-budget/budget-scan.sh +166 -0
  314. package/scripts/detect-tools.sh +3 -0
  315. package/scripts/discover-agents.sh +28 -0
  316. package/scripts/effective-backlog-settings.js +2 -0
  317. package/scripts/filter-installed-packs.js +2 -0
  318. package/scripts/flow-kit.js +2 -0
  319. package/scripts/generate-context-map.js +2 -0
  320. package/scripts/git-status.sh +49 -0
  321. package/scripts/hooks/claude-hook-adapter.js +174 -0
  322. package/scripts/hooks/claude-telemetry-hook.js +115 -0
  323. package/scripts/hooks/codex-hook-adapter.js +176 -0
  324. package/scripts/hooks/codex-telemetry-hook.js +95 -0
  325. package/scripts/hooks/config-protection.js +79 -0
  326. package/scripts/hooks/desktop-notify.sh +39 -0
  327. package/scripts/hooks/governance-audit.sh +135 -0
  328. package/scripts/hooks/lib/audit-transport.sh +40 -0
  329. package/scripts/hooks/lib/hook-flags.js +49 -0
  330. package/scripts/hooks/lib/patterns.sh +57 -0
  331. package/scripts/hooks/lib/resolve-formatter.js +80 -0
  332. package/scripts/hooks/post-edit-accumulator.js +66 -0
  333. package/scripts/hooks/pre-commit-quality.js +194 -0
  334. package/scripts/hooks/quality-gate.js +93 -0
  335. package/scripts/hooks/report-only-guard.js +21 -0
  336. package/scripts/hooks/run-hook.js +136 -0
  337. package/scripts/hooks/stop-format-typecheck.js +141 -0
  338. package/scripts/hooks/stop-goal-fit.js +337 -0
  339. package/scripts/hooks/workflow-steering.js +250 -0
  340. package/scripts/install-codex-home.sh +106 -0
  341. package/scripts/package.json +3 -0
  342. package/scripts/promote-workflow-artifact.js +2 -0
  343. package/scripts/publish-change-helper.js +2 -0
  344. package/scripts/pull-work-provider.js +2 -0
  345. package/scripts/setup-repo-hooks.sh +8 -0
  346. package/scripts/statusline/flow-agents-statusline.js +157 -0
  347. package/scripts/telemetry/console-presets.sh +14 -0
  348. package/scripts/telemetry/install-console-config.sh +214 -0
  349. package/scripts/telemetry/lib/config.sh +85 -0
  350. package/scripts/telemetry/lib/enrich.sh +115 -0
  351. package/scripts/telemetry/lib/redact.sh +22 -0
  352. package/scripts/telemetry/lib/session.sh +63 -0
  353. package/scripts/telemetry/lib/transport.sh +183 -0
  354. package/scripts/telemetry/lib/usage.sh +29 -0
  355. package/scripts/telemetry/sync-agents.sh +173 -0
  356. package/scripts/telemetry/telemetry.conf +23 -0
  357. package/scripts/telemetry/telemetry.sh +387 -0
  358. package/scripts/usage-feedback.js +2 -0
  359. package/scripts/validate-hook-influence-cases.js +2 -0
  360. package/scripts/validate-package.sh +89 -0
  361. package/scripts/validate-source-tree.js +9 -0
  362. package/skills/agentic-engineering/SKILL.md +62 -0
  363. package/skills/browser-test/SKILL.md +51 -0
  364. package/skills/builder-shape/SKILL.md +76 -0
  365. package/skills/context-budget/SKILL.md +40 -0
  366. package/skills/deliver/SKILL.md +241 -0
  367. package/skills/dependency-update/SKILL.md +68 -0
  368. package/skills/design-probe/SKILL.md +107 -0
  369. package/skills/eval-rebuild/SKILL.md +39 -0
  370. package/skills/evidence-gate/SKILL.md +186 -0
  371. package/skills/execute-plan/SKILL.md +110 -0
  372. package/skills/explore/SKILL.md +137 -0
  373. package/skills/feedback-loop/SKILL.md +87 -0
  374. package/skills/fix-bug/SKILL.md +133 -0
  375. package/skills/frontend-design/SKILL.md +80 -0
  376. package/skills/github-cli/SKILL.md +63 -0
  377. package/skills/idea-to-backlog/SKILL.md +267 -0
  378. package/skills/knowledge-capture/SKILL.md +55 -0
  379. package/skills/learning-review/SKILL.md +115 -0
  380. package/skills/pickup-probe/SKILL.md +114 -0
  381. package/skills/plan-work/SKILL.md +176 -0
  382. package/skills/pull-work/SKILL.md +309 -0
  383. package/skills/release-readiness/SKILL.md +121 -0
  384. package/skills/review-work/SKILL.md +161 -0
  385. package/skills/search-first/SKILL.md +66 -0
  386. package/skills/tdd-workflow/SKILL.md +140 -0
  387. package/skills/verify-work/SKILL.md +109 -0
  388. package/src/cli/console-learning-projection.ts +140 -0
  389. package/src/cli/effective-backlog-settings.ts +99 -0
  390. package/src/cli/fixture-retirement-audit.ts +154 -0
  391. package/src/cli/flow-kit.ts +139 -0
  392. package/src/cli/init.ts +248 -0
  393. package/src/cli/promote-workflow-artifact.ts +64 -0
  394. package/src/cli/publish-change-helper.ts +143 -0
  395. package/src/cli/pull-work-provider.ts +481 -0
  396. package/src/cli/runtime-adapter.ts +24 -0
  397. package/src/cli/telemetry-doctor.ts +243 -0
  398. package/src/cli/usage-feedback.ts +418 -0
  399. package/src/cli/validate-hook-influence.ts +119 -0
  400. package/src/cli/validate-source-tree.ts +30 -0
  401. package/src/cli/validate-workflow-artifacts.ts +411 -0
  402. package/src/cli/veritas-governance.ts +322 -0
  403. package/src/cli/workflow-artifact-cleanup-audit.ts +281 -0
  404. package/src/cli/workflow-sidecar.ts +676 -0
  405. package/src/cli.ts +95 -0
  406. package/src/flow-kit/validate.ts +74 -0
  407. package/src/lib/args.ts +43 -0
  408. package/src/lib/fs.ts +62 -0
  409. package/src/lib/workflow-learning-projection.ts +491 -0
  410. package/src/runtime-adapters.ts +154 -0
  411. package/src/tools/build-universal-bundles.ts +366 -0
  412. package/src/tools/common.ts +61 -0
  413. package/src/tools/filter-installed-packs.ts +129 -0
  414. package/src/tools/generate-context-map.ts +199 -0
  415. package/src/tools/validate-package.ts +57 -0
  416. package/src/tools/validate-source-tree.ts +488 -0
  417. package/tsconfig.json +19 -0
  418. package/veritas.claims.json +6 -0
@@ -0,0 +1,235 @@
1
+ #!/usr/bin/env bash
2
+ # test_veritas_governance_adapter.sh - optional Veritas governance adapter coverage
3
+ set -uo pipefail
4
+
5
+ ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
6
+ source "$ROOT/evals/lib/node.sh"
7
+
8
+ TMPDIR_EVAL="$(mktemp -d)"
9
+ errors=0
10
+
11
+ cleanup() {
12
+ rm -rf "$TMPDIR_EVAL"
13
+ }
14
+ trap cleanup EXIT
15
+
16
+ _pass() { echo " ✓ $1"; }
17
+ _fail() { echo " ✗ $1"; errors=$((errors + 1)); }
18
+
19
+ ADAPTER="veritas-governance"
20
+ VALIDATOR="validate-workflow-artifacts"
21
+ REPO="$TMPDIR_EVAL/repo"
22
+ ARTIFACT_DIR="$REPO/.flow-agents/veritas-fixture"
23
+ mkdir -p "$ARTIFACT_DIR" "$TMPDIR_EVAL/bin" "$REPO/.veritas"
24
+ FAKE_PASS="$ROOT/evals/fixtures/veritas-governance-adapter/fake-veritas-pass.sh"
25
+ FAKE_UNCONFIGURED="$ROOT/evals/fixtures/veritas-governance-adapter/fake-veritas-unconfigured.sh"
26
+ FAKE_SECRET_FAIL="$ROOT/evals/fixtures/veritas-governance-adapter/fake-veritas-secret-fail.sh"
27
+
28
+ cat >"$ARTIFACT_DIR/state.json" <<'JSON'
29
+ {
30
+ "schema_version": "1.0",
31
+ "task_slug": "veritas-fixture",
32
+ "status": "in_progress",
33
+ "phase": "execution",
34
+ "owner": "eval",
35
+ "created_at": "2026-06-01T00:00:00Z",
36
+ "updated_at": "2026-06-01T00:00:00Z",
37
+ "source_request": "Fixture workflow for Veritas adapter.",
38
+ "artifact_paths": ["state.json", "acceptance.json", "handoff.json"],
39
+ "next_action": {
40
+ "status": "continue",
41
+ "summary": "Run Veritas governance adapter.",
42
+ "target_phase": "verification"
43
+ }
44
+ }
45
+ JSON
46
+
47
+ cat >"$ARTIFACT_DIR/acceptance.json" <<'JSON'
48
+ {
49
+ "schema_version": "1.0",
50
+ "task_slug": "veritas-fixture",
51
+ "source_request": "Fixture workflow for Veritas adapter.",
52
+ "criteria": [
53
+ {
54
+ "id": "veritas-fixture",
55
+ "description": "Veritas evidence is mapped by reference.",
56
+ "status": "pending",
57
+ "evidence_refs": [
58
+ {
59
+ "kind": "artifact",
60
+ "file": "evidence.json",
61
+ "summary": "Veritas evidence sidecar."
62
+ }
63
+ ]
64
+ }
65
+ ],
66
+ "goal_fit": {
67
+ "status": "pending",
68
+ "summary": "Fixture goal fit is pending.",
69
+ "open_gaps": []
70
+ }
71
+ }
72
+ JSON
73
+
74
+ cat >"$ARTIFACT_DIR/handoff.json" <<'JSON'
75
+ {
76
+ "schema_version": "1.0",
77
+ "task_slug": "veritas-fixture",
78
+ "summary": "Fixture handoff for Veritas adapter.",
79
+ "current_state_ref": "state.json",
80
+ "next_steps": ["Run adapter."],
81
+ "blockers": [],
82
+ "warnings": []
83
+ }
84
+ JSON
85
+
86
+ PASS_ARTIFACT="$REPO/.veritas/readiness-pass.json"
87
+ printf '{"status":"pass","producer":"fake-veritas"}\n' >"$PASS_ARTIFACT"
88
+ VERITAS_ARGV_LOG="$TMPDIR_EVAL/pass-argv.log" VERITAS_EXPECT_ROOT="$REPO" \
89
+ flow_agents_node "$ADAPTER" evidence \
90
+ --artifact-dir "$ARTIFACT_DIR" \
91
+ --repo-root "$REPO" \
92
+ --veritas-root "$REPO" \
93
+ --veritas-bin "$FAKE_PASS" \
94
+ --veritas-artifact "$PASS_ARTIFACT" \
95
+ --max-age-seconds 300 >"$TMPDIR_EVAL/pass.out" 2>"$TMPDIR_EVAL/pass.err"
96
+ pass_status=$?
97
+
98
+ if [[ "$pass_status" -eq 0 ]] \
99
+ && rg -q '^readiness --check evidence --working-tree --root ' "$TMPDIR_EVAL/pass-argv.log" \
100
+ && node -e 'const fs=require("fs"); const ev=JSON.parse(fs.readFileSync(process.argv[1],"utf8")); if (ev.verdict!=="pass") process.exit(1); const c=ev.checks[0]; if (c.kind!=="policy" || c.status!=="pass") process.exit(2); if (c.standard_refs[0].standard!=="veritas") process.exit(3); if (ev.external_evidence[0].standard!=="veritas") process.exit(4); if (JSON.stringify(ev).includes("veritas_rule")) process.exit(5);' "$ARTIFACT_DIR/evidence.json"; then
101
+ _pass "adapter invokes configurable Veritas command and maps passing evidence by reference"
102
+ else
103
+ _fail "adapter pass case failed: $(cat "$TMPDIR_EVAL/pass.out" "$TMPDIR_EVAL/pass.err" 2>/dev/null)"
104
+ fi
105
+
106
+ if flow_agents_node "$VALIDATOR" --require-sidecars --skip-markdown-validation "$ARTIFACT_DIR" >"$TMPDIR_EVAL/validate-pass.out" 2>"$TMPDIR_EVAL/validate-pass.err"; then
107
+ _pass "adapter-produced evidence sidecar validates"
108
+ else
109
+ _fail "adapter-produced evidence sidecar did not validate: $(cat "$TMPDIR_EVAL/validate-pass.out" "$TMPDIR_EVAL/validate-pass.err")"
110
+ fi
111
+
112
+ CUSTOM_EVIDENCE="$TMPDIR_EVAL/custom/evidence.json"
113
+ VERITAS_ARGV_LOG="$TMPDIR_EVAL/relative-artifact-argv.log" \
114
+ flow_agents_node "$ADAPTER" evidence \
115
+ --artifact-dir "$ARTIFACT_DIR" \
116
+ --evidence-path "$CUSTOM_EVIDENCE" \
117
+ --repo-root "$REPO" \
118
+ --veritas-bin "$FAKE_PASS" \
119
+ --veritas-artifact ".veritas/readiness-pass.json" \
120
+ --max-age-seconds 300 >"$TMPDIR_EVAL/relative-artifact.out" 2>"$TMPDIR_EVAL/relative-artifact.err"
121
+ relative_artifact_status=$?
122
+
123
+ if [[ "$relative_artifact_status" -eq 0 ]] \
124
+ && node -e 'const fs=require("fs"); const path=require("path"); const ev=JSON.parse(fs.readFileSync(process.argv[1],"utf8")); const expected=path.resolve(process.argv[2], ".veritas/readiness-pass.json"); if (ev.verdict!=="pass") process.exit(1); if (ev.checks[0].artifact_refs[0].file!==expected) process.exit(2); if (ev.external_evidence[0].ref.file!==expected) process.exit(3);' "$CUSTOM_EVIDENCE" "$REPO"; then
125
+ _pass "relative native artifact resolves against non-default repo root and custom evidence path is honored"
126
+ else
127
+ _fail "relative artifact/custom evidence case failed: $(cat "$TMPDIR_EVAL/relative-artifact.out" "$TMPDIR_EVAL/relative-artifact.err" 2>/dev/null)"
128
+ fi
129
+
130
+ if flow_agents_node "$ADAPTER" evidence \
131
+ --artifact-dir "$ARTIFACT_DIR" \
132
+ --repo-root "$REPO" \
133
+ --veritas-bin "$FAKE_UNCONFIGURED" \
134
+ --veritas-artifact "$REPO/.veritas/unconfigured.json" >"$TMPDIR_EVAL/fail.out" 2>"$TMPDIR_EVAL/fail.err" \
135
+ && node -e 'const fs=require("fs"); const ev=JSON.parse(fs.readFileSync(process.argv[1],"utf8")); if (ev.verdict!=="not_verified") process.exit(1); if (ev.checks[0].status!=="not_verified") process.exit(2); if (!/exit status 78/.test(ev.checks[0].summary)) process.exit(3);' "$ARTIFACT_DIR/evidence.json"; then
136
+ _pass "nonzero/unconfigured Veritas records not_verified evidence"
137
+ else
138
+ _fail "nonzero Veritas case failed: $(cat "$TMPDIR_EVAL/fail.out" "$TMPDIR_EVAL/fail.err" 2>/dev/null)"
139
+ fi
140
+
141
+ if flow_agents_node "$ADAPTER" evidence \
142
+ --artifact-dir "$ARTIFACT_DIR" \
143
+ --repo-root "$REPO" \
144
+ --veritas-bin "$FAKE_SECRET_FAIL" >"$TMPDIR_EVAL/secret-fail.out" 2>"$TMPDIR_EVAL/secret-fail.err" \
145
+ && node -e 'const fs=require("fs"); const ev=JSON.parse(fs.readFileSync(process.argv[1],"utf8")); const text=JSON.stringify(ev); if (ev.verdict!=="not_verified") process.exit(1); if (!/exit status 17/.test(ev.checks[0].summary)) process.exit(2); if (/fixture-token-redaction-sentinel|fixture-api-key-redaction-sentinel/.test(text)) process.exit(3); if (!text.includes("[REDACTED]")) process.exit(4); if (!/Output truncated/.test(ev.checks[0].summary)) process.exit(5); if (/detail line 40/.test(text)) process.exit(6);' "$ARTIFACT_DIR/evidence.json"; then
146
+ _pass "nonzero Veritas output is redacted and bounded before persistence"
147
+ else
148
+ _fail "secret-bearing nonzero Veritas case failed: $(cat "$TMPDIR_EVAL/secret-fail.out" "$TMPDIR_EVAL/secret-fail.err" 2>/dev/null)"
149
+ fi
150
+
151
+ if flow_agents_node "$ADAPTER" evidence \
152
+ --artifact-dir "$ARTIFACT_DIR" \
153
+ --repo-root "$REPO" \
154
+ --veritas-bin "$TMPDIR_EVAL/bin/not-a-real-veritas" >"$TMPDIR_EVAL/missing-bin.out" 2>"$TMPDIR_EVAL/missing-bin.err" \
155
+ && node -e 'const fs=require("fs"); const ev=JSON.parse(fs.readFileSync(process.argv[1],"utf8")); if (ev.verdict!=="not_verified") process.exit(1); if (!/Unable to run Veritas executable/.test(ev.checks[0].summary)) process.exit(2);' "$ARTIFACT_DIR/evidence.json"; then
156
+ _pass "missing executable records not_verified evidence"
157
+ else
158
+ _fail "missing executable case failed: $(cat "$TMPDIR_EVAL/missing-bin.out" "$TMPDIR_EVAL/missing-bin.err" 2>/dev/null)"
159
+ fi
160
+
161
+ MISSING_ARTIFACT="$REPO/.veritas/missing.json"
162
+ VERITAS_ARGV_LOG="$TMPDIR_EVAL/missing-artifact-argv.log" \
163
+ flow_agents_node "$ADAPTER" evidence \
164
+ --artifact-dir "$ARTIFACT_DIR" \
165
+ --repo-root "$REPO" \
166
+ --veritas-bin "$FAKE_PASS" \
167
+ --veritas-artifact "$MISSING_ARTIFACT" >"$TMPDIR_EVAL/missing-artifact.out" 2>"$TMPDIR_EVAL/missing-artifact.err"
168
+ missing_artifact_status=$?
169
+
170
+ if [[ "$missing_artifact_status" -eq 0 ]] \
171
+ && node -e 'const fs=require("fs"); const ev=JSON.parse(fs.readFileSync(process.argv[1],"utf8")); if (ev.verdict!=="not_verified") process.exit(1); if (!/expected native artifact is missing/.test(ev.checks[0].summary)) process.exit(2);' "$ARTIFACT_DIR/evidence.json"; then
172
+ _pass "missing native artifact records not_verified evidence"
173
+ else
174
+ _fail "missing native artifact case failed: $(cat "$TMPDIR_EVAL/missing-artifact.out" "$TMPDIR_EVAL/missing-artifact.err" 2>/dev/null)"
175
+ fi
176
+
177
+ UNREADABLE_ARTIFACT="$REPO/.veritas/unreadable.json"
178
+ printf '{"status":"pass"}\n' >"$UNREADABLE_ARTIFACT"
179
+ chmod 000 "$UNREADABLE_ARTIFACT"
180
+ VERITAS_ARGV_LOG="$TMPDIR_EVAL/unreadable-argv.log" \
181
+ flow_agents_node "$ADAPTER" evidence \
182
+ --artifact-dir "$ARTIFACT_DIR" \
183
+ --repo-root "$REPO" \
184
+ --veritas-bin "$FAKE_PASS" \
185
+ --veritas-artifact "$UNREADABLE_ARTIFACT" >"$TMPDIR_EVAL/unreadable.out" 2>"$TMPDIR_EVAL/unreadable.err"
186
+ unreadable_status=$?
187
+ chmod 600 "$UNREADABLE_ARTIFACT"
188
+
189
+ if [[ "$unreadable_status" -eq 0 ]] \
190
+ && node -e 'const fs=require("fs"); const ev=JSON.parse(fs.readFileSync(process.argv[1],"utf8")); if (ev.verdict!=="not_verified") process.exit(1); if (!/unreadable/.test(ev.checks[0].summary)) process.exit(2);' "$ARTIFACT_DIR/evidence.json"; then
191
+ _pass "unreadable native artifact records not_verified evidence"
192
+ else
193
+ _fail "unreadable native artifact case failed: $(cat "$TMPDIR_EVAL/unreadable.out" "$TMPDIR_EVAL/unreadable.err" 2>/dev/null)"
194
+ fi
195
+
196
+ STALE_ARTIFACT="$REPO/.veritas/stale.json"
197
+ printf '{"status":"pass"}\n' >"$STALE_ARTIFACT"
198
+ touch -t 202001010000 "$STALE_ARTIFACT"
199
+ VERITAS_ARGV_LOG="$TMPDIR_EVAL/stale-argv.log" \
200
+ flow_agents_node "$ADAPTER" evidence \
201
+ --artifact-dir "$ARTIFACT_DIR" \
202
+ --repo-root "$REPO" \
203
+ --veritas-bin "$FAKE_PASS" \
204
+ --veritas-artifact "$STALE_ARTIFACT" \
205
+ --max-age-seconds 0 >"$TMPDIR_EVAL/stale.out" 2>"$TMPDIR_EVAL/stale.err"
206
+ stale_status=$?
207
+
208
+ if [[ "$stale_status" -eq 0 ]] \
209
+ && node -e 'const fs=require("fs"); const ev=JSON.parse(fs.readFileSync(process.argv[1],"utf8")); if (ev.verdict!=="not_verified") process.exit(1); if (!/stale/.test(ev.checks[0].summary)) process.exit(2);' "$ARTIFACT_DIR/evidence.json"; then
210
+ _pass "stale native artifact records not_verified evidence"
211
+ else
212
+ _fail "stale artifact case failed: $(cat "$TMPDIR_EVAL/stale.out" "$TMPDIR_EVAL/stale.err" 2>/dev/null)"
213
+ fi
214
+
215
+ if flow_agents_node "$ADAPTER" evidence --artifact-dir "$ARTIFACT_DIR" --skip >"$TMPDIR_EVAL/skip.out" 2>"$TMPDIR_EVAL/skip.err" \
216
+ && node -e 'const fs=require("fs"); const ev=JSON.parse(fs.readFileSync(process.argv[1],"utf8")); if (ev.verdict!=="partial") process.exit(1); if (ev.checks[0].status!=="skip") process.exit(2);' "$ARTIFACT_DIR/evidence.json"; then
217
+ _pass "explicit skip records skip evidence"
218
+ else
219
+ _fail "skip case failed: $(cat "$TMPDIR_EVAL/skip.out" "$TMPDIR_EVAL/skip.err" 2>/dev/null)"
220
+ fi
221
+
222
+ if flow_agents_node "$ADAPTER" evidence --artifact-dir "$ARTIFACT_DIR" --not-configured >"$TMPDIR_EVAL/not-configured.out" 2>"$TMPDIR_EVAL/not-configured.err" \
223
+ && node -e 'const fs=require("fs"); const ev=JSON.parse(fs.readFileSync(process.argv[1],"utf8")); if (ev.verdict!=="not_verified") process.exit(1); if (ev.checks[0].status!=="not_verified") process.exit(2); if (!/not configured/.test(ev.checks[0].summary)) process.exit(3);' "$ARTIFACT_DIR/evidence.json"; then
224
+ _pass "no-config path records not_verified evidence"
225
+ else
226
+ _fail "not-configured case failed: $(cat "$TMPDIR_EVAL/not-configured.out" "$TMPDIR_EVAL/not-configured.err" 2>/dev/null)"
227
+ fi
228
+
229
+ if [[ "$errors" -eq 0 ]]; then
230
+ echo "Veritas governance adapter integration eval passed."
231
+ exit 0
232
+ fi
233
+
234
+ echo "Veritas governance adapter integration eval failed with $errors error(s)." >&2
235
+ exit 1
@@ -0,0 +1,287 @@
1
+ #!/usr/bin/env bash
2
+ set -uo pipefail
3
+
4
+ ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
+ SCRIPT="workflow-artifact-cleanup-audit"
6
+ TMPDIR_EVAL="$(mktemp -d)"
7
+ ARTIFACT_ROOT="$TMPDIR_EVAL/flow-agents"
8
+ trap 'rm -rf "$TMPDIR_EVAL"' EXIT
9
+
10
+ source "$ROOT/evals/lib/node.sh"
11
+
12
+ errors=0
13
+ pass() { echo " ✓ $1"; }
14
+ fail() { echo " ✗ $1"; errors=$((errors + 1)); }
15
+
16
+ mkdir -p "$ARTIFACT_ROOT"/{active-wip,terminal-done,stale-verified,learning-followup,delivered-learning-followup,invalid-learning-route,invalid-sidecar,symlink-state,large-learning,missing-state-next-action,missing-learning-records,non-array-learning-records,changes,archive,.hidden}
17
+
18
+ cat > "$ARTIFACT_ROOT/active-wip/state.json" <<'JSON'
19
+ {
20
+ "schema_version": "1.0",
21
+ "task_slug": "active-wip",
22
+ "status": "in_progress",
23
+ "phase": "execution",
24
+ "updated_at": "2026-06-01T00:00:00Z",
25
+ "next_action": { "status": "continue", "summary": "keep working" }
26
+ }
27
+ JSON
28
+
29
+ cat > "$ARTIFACT_ROOT/terminal-done/state.json" <<'JSON'
30
+ {
31
+ "schema_version": "1.0",
32
+ "task_slug": "terminal-done",
33
+ "status": "accepted",
34
+ "phase": "done",
35
+ "updated_at": "2026-06-01T00:00:00Z",
36
+ "next_action": { "status": "done", "summary": "accepted" }
37
+ }
38
+ JSON
39
+
40
+ cat > "$ARTIFACT_ROOT/stale-verified/state.json" <<'JSON'
41
+ {
42
+ "schema_version": "1.0",
43
+ "task_slug": "stale-verified",
44
+ "status": "verified",
45
+ "phase": "verification",
46
+ "updated_at": "2026-06-01T00:00:00Z",
47
+ "next_action": { "status": "done", "summary": "ready for cleanup" }
48
+ }
49
+ JSON
50
+
51
+ cat > "$ARTIFACT_ROOT/learning-followup/state.json" <<'JSON'
52
+ {
53
+ "schema_version": "1.0",
54
+ "task_slug": "learning-followup",
55
+ "status": "accepted",
56
+ "phase": "learning",
57
+ "updated_at": "2026-06-01T00:00:00Z",
58
+ "next_action": { "status": "done", "summary": "accepted with learning" }
59
+ }
60
+ JSON
61
+
62
+ cat > "$ARTIFACT_ROOT/learning-followup/learning.json" <<'JSON'
63
+ {
64
+ "schema_version": "1.0",
65
+ "task_slug": "learning-followup",
66
+ "status": "followup_required",
67
+ "updated_at": "2026-06-01T00:00:00Z",
68
+ "records": [
69
+ {
70
+ "id": "learn-1",
71
+ "recorded_at": "2026-06-01T00:00:00Z",
72
+ "source_refs": ["verification"],
73
+ "outcome": "mixed",
74
+ "facts": ["Open follow-up remains."],
75
+ "interpretation": "Route this learning before cleanup.",
76
+ "routing": [
77
+ { "target": "doc", "action": "Document lifecycle command.", "status": "open" }
78
+ ]
79
+ }
80
+ ]
81
+ }
82
+ JSON
83
+
84
+ cat > "$ARTIFACT_ROOT/delivered-learning-followup/state.json" <<'JSON'
85
+ {
86
+ "schema_version": "1.0",
87
+ "task_slug": "delivered-learning-followup",
88
+ "status": "delivered",
89
+ "phase": "done",
90
+ "updated_at": "2026-06-01T00:00:00Z",
91
+ "next_action": { "status": "done", "summary": "delivered with unresolved learning" }
92
+ }
93
+ JSON
94
+
95
+ cat > "$ARTIFACT_ROOT/delivered-learning-followup/learning.json" <<'JSON'
96
+ {
97
+ "schema_version": "1.0",
98
+ "task_slug": "delivered-learning-followup",
99
+ "status": "followup_required",
100
+ "updated_at": "2026-06-01T00:00:00Z",
101
+ "records": [
102
+ {
103
+ "id": "learn-delivered",
104
+ "recorded_at": "2026-06-01T00:00:00Z",
105
+ "source_refs": ["release"],
106
+ "outcome": "mixed",
107
+ "facts": ["Delivered work still has an open learning route."],
108
+ "interpretation": "Open learning must win over terminal lifecycle shape.",
109
+ "routing": [
110
+ { "target": "skill", "action": "Update workflow guidance.", "status": "open" }
111
+ ]
112
+ }
113
+ ]
114
+ }
115
+ JSON
116
+
117
+ cat > "$ARTIFACT_ROOT/invalid-learning-route/state.json" <<'JSON'
118
+ {
119
+ "schema_version": "1.0",
120
+ "task_slug": "invalid-learning-route",
121
+ "status": "accepted",
122
+ "phase": "done",
123
+ "updated_at": "2026-06-01T00:00:00Z",
124
+ "next_action": { "status": "done", "summary": "accepted with malformed learning routing" }
125
+ }
126
+ JSON
127
+
128
+ cat > "$ARTIFACT_ROOT/invalid-learning-route/learning.json" <<'JSON'
129
+ {
130
+ "schema_version": "1.0",
131
+ "task_slug": "invalid-learning-route",
132
+ "status": "learned",
133
+ "updated_at": "2026-06-01T00:00:00Z",
134
+ "records": [
135
+ {
136
+ "id": "learn-invalid-route",
137
+ "recorded_at": "2026-06-01T00:00:00Z",
138
+ "source_refs": ["review"],
139
+ "outcome": "unknown",
140
+ "facts": ["A routing entry is missing required status."],
141
+ "interpretation": "Malformed learning routing must make the workflow invalid.",
142
+ "routing": [
143
+ { "target": "doc", "action": "Document missing status handling." }
144
+ ]
145
+ }
146
+ ]
147
+ }
148
+ JSON
149
+
150
+ cat > "$ARTIFACT_ROOT/missing-state-next-action/state.json" <<'JSON'
151
+ {
152
+ "schema_version": "1.0",
153
+ "task_slug": "missing-state-next-action",
154
+ "status": "accepted",
155
+ "phase": "done",
156
+ "updated_at": "2026-06-01T00:00:00Z"
157
+ }
158
+ JSON
159
+
160
+ cat > "$ARTIFACT_ROOT/missing-learning-records/state.json" <<'JSON'
161
+ {
162
+ "schema_version": "1.0",
163
+ "task_slug": "missing-learning-records",
164
+ "status": "accepted",
165
+ "phase": "done",
166
+ "updated_at": "2026-06-01T00:00:00Z",
167
+ "next_action": { "status": "done", "summary": "accepted with malformed learning" }
168
+ }
169
+ JSON
170
+
171
+ cat > "$ARTIFACT_ROOT/missing-learning-records/learning.json" <<'JSON'
172
+ {
173
+ "schema_version": "1.0",
174
+ "task_slug": "missing-learning-records",
175
+ "status": "learned",
176
+ "updated_at": "2026-06-01T00:00:00Z"
177
+ }
178
+ JSON
179
+
180
+ cat > "$ARTIFACT_ROOT/non-array-learning-records/state.json" <<'JSON'
181
+ {
182
+ "schema_version": "1.0",
183
+ "task_slug": "non-array-learning-records",
184
+ "status": "accepted",
185
+ "phase": "done",
186
+ "updated_at": "2026-06-01T00:00:00Z",
187
+ "next_action": { "status": "done", "summary": "accepted with malformed learning" }
188
+ }
189
+ JSON
190
+
191
+ cat > "$ARTIFACT_ROOT/non-array-learning-records/learning.json" <<'JSON'
192
+ {
193
+ "schema_version": "1.0",
194
+ "task_slug": "non-array-learning-records",
195
+ "status": "learned",
196
+ "updated_at": "2026-06-01T00:00:00Z",
197
+ "records": {}
198
+ }
199
+ JSON
200
+
201
+ cat > "$ARTIFACT_ROOT/large-learning/state.json" <<'JSON'
202
+ {
203
+ "schema_version": "1.0",
204
+ "task_slug": "large-learning",
205
+ "status": "accepted",
206
+ "phase": "done",
207
+ "updated_at": "2026-06-01T00:00:00Z",
208
+ "next_action": { "status": "done", "summary": "oversized learning sidecar" }
209
+ }
210
+ JSON
211
+
212
+ printf '{ "schema_version": "1.0", "status": ' > "$ARTIFACT_ROOT/invalid-sidecar/state.json"
213
+ ln -s "$ARTIFACT_ROOT/active-wip/state.json" "$ARTIFACT_ROOT/symlink-state/state.json"
214
+ node -e 'const fs=require("fs"); fs.writeFileSync(process.argv[1], " ".repeat(1024 * 1024 + 1));' "$ARTIFACT_ROOT/large-learning/learning.json"
215
+ find "$ARTIFACT_ROOT" -mindepth 1 -maxdepth 1 -type d | sort > "$TMPDIR_EVAL/before.txt"
216
+
217
+ echo "=== Workflow Artifact Cleanup Audit ==="
218
+
219
+ flow_agents_node "$SCRIPT" --artifact-root "$ARTIFACT_ROOT" > "$TMPDIR_EVAL/audit.txt"
220
+ status=$?
221
+ [[ "$status" -eq 0 ]] && pass "text audit exits successfully" || fail "text audit exits successfully"
222
+
223
+ grep -q "Active WIP: 1" "$TMPDIR_EVAL/audit.txt" && pass "text separates active WIP bucket" || fail "text separates active WIP bucket"
224
+ grep -q "Cleanup candidates: 1" "$TMPDIR_EVAL/audit.txt" && pass "text separates cleanup candidate bucket" || fail "text separates cleanup candidate bucket"
225
+ grep -q "Active learning follow-ups: 2" "$TMPDIR_EVAL/audit.txt" && pass "text reports learning follow-up bucket" || fail "text reports learning follow-up bucket"
226
+ grep -q "Invalid sidecars: 7" "$TMPDIR_EVAL/audit.txt" && pass "text reports invalid bucket" || fail "text reports invalid bucket"
227
+
228
+ if grep -A3 "Active WIP: 1" "$TMPDIR_EVAL/audit.txt" | grep -q "stale-verified"; then
229
+ fail "verified done fixture is not active WIP"
230
+ else
231
+ pass "verified done fixture is not active WIP"
232
+ fi
233
+
234
+ flow_agents_node "$SCRIPT" --artifact-root "$ARTIFACT_ROOT" --json > "$TMPDIR_EVAL/audit.json"
235
+ status=$?
236
+ [[ "$status" -eq 0 ]] && pass "json audit exits successfully" || fail "json audit exits successfully"
237
+
238
+ json_query() {
239
+ node -e 'const fs=require("fs"); let cur=JSON.parse(fs.readFileSync(process.argv[1],"utf8")); for (const part of process.argv[2].split(".")) cur=Array.isArray(cur) ? cur[Number(part)] : cur[part]; console.log(cur);' "$1" "$2"
240
+ }
241
+
242
+ [[ "$(json_query "$TMPDIR_EVAL/audit.json" "buckets.active_wip.0.slug")" == "active-wip" ]] && pass "json classifies active fixture" || fail "json classifies active fixture"
243
+ [[ "$(json_query "$TMPDIR_EVAL/audit.json" "buckets.terminal_done.0.slug")" == "terminal-done" ]] && pass "json classifies terminal fixture" || fail "json classifies terminal fixture"
244
+ [[ "$(json_query "$TMPDIR_EVAL/audit.json" "buckets.cleanup_candidate.0.slug")" == "stale-verified" ]] && pass "json classifies stale verified cleanup fixture" || fail "json classifies stale verified cleanup fixture"
245
+ [[ "$(json_query "$TMPDIR_EVAL/audit.json" "buckets.active_learning_followup.0.slug")" == "delivered-learning-followup" ]] && pass "json keeps delivered done open learning active" || fail "json keeps delivered done open learning active"
246
+ [[ "$(json_query "$TMPDIR_EVAL/audit.json" "buckets.active_learning_followup.1.slug")" == "learning-followup" ]] && pass "json keeps open learning routing active" || fail "json keeps open learning routing active"
247
+ [[ "$(json_query "$TMPDIR_EVAL/audit.json" "buckets.invalid.0.slug")" == "invalid-learning-route" ]] && pass "json classifies malformed learning routing invalid" || fail "json classifies malformed learning routing invalid"
248
+ [[ "$(json_query "$TMPDIR_EVAL/audit.json" "buckets.invalid.0.reasons.0")" == "learning routing status is missing or invalid" ]] && pass "json reports missing learning routing status" || fail "json reports missing learning routing status"
249
+ [[ "$(json_query "$TMPDIR_EVAL/audit.json" "buckets.invalid.1.slug")" == "invalid-sidecar" ]] && pass "json classifies invalid sidecar fixture" || fail "json classifies invalid sidecar fixture"
250
+ [[ "$(json_query "$TMPDIR_EVAL/audit.json" "buckets.invalid.2.slug")" == "large-learning" ]] && pass "json classifies oversized learning sidecar invalid" || fail "json classifies oversized learning sidecar invalid"
251
+ [[ "$(json_query "$TMPDIR_EVAL/audit.json" "buckets.invalid.3.slug")" == "missing-learning-records" ]] && pass "json classifies missing learning records invalid" || fail "json classifies missing learning records invalid"
252
+ [[ "$(json_query "$TMPDIR_EVAL/audit.json" "buckets.invalid.3.reasons.0")" == "learning.records is missing or invalid" ]] && pass "json reports missing learning records" || fail "json reports missing learning records"
253
+ [[ "$(json_query "$TMPDIR_EVAL/audit.json" "buckets.invalid.4.slug")" == "missing-state-next-action" ]] && pass "json classifies missing state next_action invalid" || fail "json classifies missing state next_action invalid"
254
+ [[ "$(json_query "$TMPDIR_EVAL/audit.json" "buckets.invalid.4.reasons.0")" == "state.next_action is missing or invalid" ]] && pass "json reports missing state next_action" || fail "json reports missing state next_action"
255
+ [[ "$(json_query "$TMPDIR_EVAL/audit.json" "buckets.invalid.5.slug")" == "non-array-learning-records" ]] && pass "json classifies non-array learning records invalid" || fail "json classifies non-array learning records invalid"
256
+ [[ "$(json_query "$TMPDIR_EVAL/audit.json" "buckets.invalid.5.reasons.0")" == "learning.records is missing or invalid" ]] && pass "json reports non-array learning records" || fail "json reports non-array learning records"
257
+ [[ "$(json_query "$TMPDIR_EVAL/audit.json" "buckets.invalid.6.slug")" == "symlink-state" ]] && pass "json classifies symlink state sidecar invalid" || fail "json classifies symlink state sidecar invalid"
258
+ [[ "$(json_query "$TMPDIR_EVAL/audit.json" "buckets.invalid.6.reasons.0")" == "state.json must not be a symlink" ]] && pass "json reports symlink rejection without reading target" || fail "json reports symlink rejection without reading target"
259
+ [[ "$(json_query "$TMPDIR_EVAL/audit.json" "buckets.cleanup_candidate.0.classification")" == "cleanup_candidate" ]] && pass "json includes stable classification field" || fail "json includes stable classification field"
260
+
261
+ if flow_agents_node "$SCRIPT" --artifact-root "$TMPDIR_EVAL/missing-root" > "$TMPDIR_EVAL/missing-root.out" 2> "$TMPDIR_EVAL/missing-root.err"; then
262
+ fail "missing artifact root exits nonzero"
263
+ else
264
+ pass "missing artifact root exits nonzero"
265
+ fi
266
+ grep -q "workflow-artifact-cleanup-audit:" "$TMPDIR_EVAL/missing-root.err" && pass "missing artifact root reports controlled error prefix" || fail "missing artifact root reports controlled error prefix"
267
+ grep -Eq "ENOENT|no such file|cannot find" "$TMPDIR_EVAL/missing-root.err" && pass "missing artifact root reports missing path" || fail "missing artifact root reports missing path"
268
+ grep -q "Error:" "$TMPDIR_EVAL/missing-root.err" && fail "missing artifact root does not print Node stack header" || pass "missing artifact root does not print Node stack header"
269
+
270
+ flow_agents_node "$SCRIPT" --help > "$TMPDIR_EVAL/help.txt"
271
+ if grep -Eq -- "--(apply|delete|archive)" "$TMPDIR_EVAL/help.txt"; then
272
+ fail "help does not advertise apply/delete/archive flags"
273
+ else
274
+ pass "help does not advertise apply/delete/archive flags"
275
+ fi
276
+
277
+ find "$ARTIFACT_ROOT" -mindepth 1 -maxdepth 1 -type d | sort > "$TMPDIR_EVAL/after.txt"
278
+ cmp -s "$TMPDIR_EVAL/before.txt" "$TMPDIR_EVAL/after.txt" && pass "audit leaves fixture directories in place" || fail "audit leaves fixture directories in place"
279
+ [[ -f "$ARTIFACT_ROOT/stale-verified/state.json" ]] && pass "audit leaves fixture files in place" || fail "audit leaves fixture files in place"
280
+
281
+ if [[ "$errors" -eq 0 ]]; then
282
+ echo "Workflow artifact cleanup audit checks passed"
283
+ else
284
+ echo "Workflow artifact cleanup audit checks failed: $errors"
285
+ fi
286
+
287
+ exit "$errors"