@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.
- package/.githooks/pre-push +11 -0
- package/.github/workflows/ci.yml +210 -0
- package/.github/workflows/docs-pages.yml +52 -0
- package/.github/workflows/publish-npm.yml +104 -0
- package/AGENTS.md +26 -0
- package/CHANGELOG.md +66 -0
- package/CODE_OF_CONDUCT.md +25 -0
- package/CONTEXT.md +300 -0
- package/CONTRIBUTING.md +44 -0
- package/LICENSE +201 -0
- package/README.md +129 -0
- package/SECURITY.md +33 -0
- package/agent-cards/dev.json +19 -0
- package/agents/dev.json +127 -0
- package/agents/tool-code-reviewer.json +61 -0
- package/agents/tool-dependencies-updater.json +118 -0
- package/agents/tool-explore-config.json +92 -0
- package/agents/tool-explore-deps.json +92 -0
- package/agents/tool-explore-entry.json +92 -0
- package/agents/tool-explore-patterns.json +92 -0
- package/agents/tool-explore-structure.json +92 -0
- package/agents/tool-explore-tests.json +92 -0
- package/agents/tool-planner.json +57 -0
- package/agents/tool-playwright.json +145 -0
- package/agents/tool-security-reviewer.json +56 -0
- package/agents/tool-verifier.json +61 -0
- package/agents/tool-worker.json +58 -0
- package/build/src/cli/console-learning-projection.js +123 -0
- package/build/src/cli/docs-preview.js +39 -0
- package/build/src/cli/effective-backlog-settings.js +102 -0
- package/build/src/cli/export-bookmarks.js +38 -0
- package/build/src/cli/fixture-retirement-audit.js +140 -0
- package/build/src/cli/flow-kit.js +138 -0
- package/build/src/cli/import-bookmarks.js +50 -0
- package/build/src/cli/init.js +239 -0
- package/build/src/cli/instinct-cli.js +93 -0
- package/build/src/cli/promote-workflow-artifact.js +63 -0
- package/build/src/cli/publish-change-helper.js +154 -0
- package/build/src/cli/pull-work-provider.js +469 -0
- package/build/src/cli/runtime-adapter.js +23 -0
- package/build/src/cli/telemetry-doctor.js +221 -0
- package/build/src/cli/usage-feedback.js +443 -0
- package/build/src/cli/validate-hook-influence.js +152 -0
- package/build/src/cli/validate-source-tree.js +31 -0
- package/build/src/cli/validate-workflow-artifacts.js +486 -0
- package/build/src/cli/veritas-governance.js +262 -0
- package/build/src/cli/workflow-artifact-cleanup-audit.js +272 -0
- package/build/src/cli/workflow-sidecar.js +816 -0
- package/build/src/cli.js +89 -0
- package/build/src/flow-kit/validate.js +75 -0
- package/build/src/lib/args.js +45 -0
- package/build/src/lib/fs.js +62 -0
- package/build/src/lib/workflow-learning-projection.js +334 -0
- package/build/src/runtime-adapters.js +146 -0
- package/build/src/tools/build-universal-bundles.js +397 -0
- package/build/src/tools/common.js +56 -0
- package/build/src/tools/filter-installed-packs.js +132 -0
- package/build/src/tools/generate-context-map.js +198 -0
- package/build/src/tools/validate-package.js +64 -0
- package/build/src/tools/validate-source-tree.js +622 -0
- package/console.telemetry.json +176 -0
- package/context/base-rules.md +17 -0
- package/context/code-review-standards.md +62 -0
- package/context/coding-standards.md +42 -0
- package/context/common/orchestrators.md +12 -0
- package/context/common/subagents.md +28 -0
- package/context/contracts/artifact-contract.md +182 -0
- package/context/contracts/builder-kit-workflow-state-contract.md +319 -0
- package/context/contracts/delivery-contract.md +69 -0
- package/context/contracts/execution-contract.md +53 -0
- package/context/contracts/governance-adapter-contract.md +67 -0
- package/context/contracts/planning-contract.md +85 -0
- package/context/contracts/review-contract.md +104 -0
- package/context/contracts/sandbox-policy.md +52 -0
- package/context/contracts/verification-contract.md +134 -0
- package/context/contracts/work-item-contract.md +215 -0
- package/context/deferred/demo-mode.md +33 -0
- package/context/deferred/languages/go.md +31 -0
- package/context/deferred/languages/python.md +31 -0
- package/context/deferred/languages/typescript.md +34 -0
- package/context/deferred/parallelization.md +35 -0
- package/context/deferred/worktree-isolation.md +24 -0
- package/context/development-workflow.md +50 -0
- package/context/scripts/context-budget/budget-scan.sh +166 -0
- package/context/scripts/detect-tools.sh +3 -0
- package/context/scripts/discover-agents.sh +28 -0
- package/context/scripts/git-status.sh +49 -0
- package/context/scripts/hooks/config-protection.js +79 -0
- package/context/scripts/hooks/desktop-notify.sh +39 -0
- package/context/scripts/hooks/governance-audit.sh +135 -0
- package/context/scripts/hooks/lib/audit-transport.sh +40 -0
- package/context/scripts/hooks/lib/hook-flags.js +49 -0
- package/context/scripts/hooks/lib/patterns.sh +57 -0
- package/context/scripts/hooks/lib/resolve-formatter.js +80 -0
- package/context/scripts/hooks/post-edit-accumulator.js +66 -0
- package/context/scripts/hooks/pre-commit-quality.js +194 -0
- package/context/scripts/hooks/quality-gate.js +93 -0
- package/context/scripts/hooks/report-only-guard.js +21 -0
- package/context/scripts/hooks/run-hook.js +136 -0
- package/context/scripts/hooks/stop-format-typecheck.js +141 -0
- package/context/scripts/hooks/stop-goal-fit.js +337 -0
- package/context/scripts/hooks/workflow-steering.js +250 -0
- package/context/scripts/telemetry/console-presets.sh +14 -0
- package/context/scripts/telemetry/install-console-config.sh +214 -0
- package/context/scripts/telemetry/lib/config.sh +85 -0
- package/context/scripts/telemetry/lib/enrich.sh +115 -0
- package/context/scripts/telemetry/lib/redact.sh +22 -0
- package/context/scripts/telemetry/lib/session.sh +63 -0
- package/context/scripts/telemetry/lib/transport.sh +183 -0
- package/context/scripts/telemetry/lib/usage.sh +29 -0
- package/context/scripts/telemetry/sync-agents.sh +173 -0
- package/context/scripts/telemetry/telemetry.conf +23 -0
- package/context/scripts/telemetry/telemetry.sh +387 -0
- package/context/scripts/validate-package.sh +89 -0
- package/context/settings/backlog-provider-settings.json +54 -0
- package/context/templates/core/identity.md +26 -0
- package/context/templates/core/user.md +15 -0
- package/docs/_config.yml +15 -0
- package/docs/_layouts/default.html +87 -0
- package/docs/adr/0001-flow-agents-consumes-flow.md +77 -0
- package/docs/adr/0002-flow-kits-as-extension-unit.md +13 -0
- package/docs/adr/0003-flow-agents-coordinates-kits-and-adapters.md +13 -0
- package/docs/adr/0004-gates-expect-surface-claims.md +15 -0
- package/docs/adr/0005-kubernetes-inspired-resource-contracts.md +48 -0
- package/docs/adr/0006-typescript-first-source-policy.md +98 -0
- package/docs/agent-system-guidebook.md +391 -0
- package/docs/agent-usage-feedback-loop.md +351 -0
- package/docs/assets/favicon.svg +13 -0
- package/docs/assets/og-image.png +0 -0
- package/docs/assets/site.css +774 -0
- package/docs/assets/site.js +139 -0
- package/docs/configurable-workflow-routing.md +174 -0
- package/docs/context-map.md +145 -0
- package/docs/developer-architecture.md +145 -0
- package/docs/developer-hook-setup.md +61 -0
- package/docs/fixture-ownership.md +44 -0
- package/docs/flow-kit-repository-contract.md +180 -0
- package/docs/index.md +129 -0
- package/docs/kontour-resource-contract.md +358 -0
- package/docs/migrations.md +64 -0
- package/docs/north-star.md +322 -0
- package/docs/operating-layers.md +110 -0
- package/docs/repository-structure.md +132 -0
- package/docs/sandbox-policy.md +56 -0
- package/docs/skills-map.md +203 -0
- package/docs/standards-register.md +96 -0
- package/docs/veritas-integration.md +165 -0
- package/docs/work-item-adapters.md +72 -0
- package/docs/workflow-artifact-lifecycle.md +141 -0
- package/docs/workflow-eval-strategy.md +295 -0
- package/docs/workflow-shared-contracts.md +51 -0
- package/docs/workflow-usage-guide.md +443 -0
- package/evals/ARCHITECTURE.md +143 -0
- package/evals/CONVENTIONS.md +58 -0
- package/evals/README.md +128 -0
- package/evals/acceptance/run.sh +29 -0
- package/evals/acceptance/test_claude_harness.sh +242 -0
- package/evals/acceptance/test_codex_harness.sh +108 -0
- package/evals/acceptance/test_kiro_harness.sh +128 -0
- package/evals/cases/dev/404.html +97 -0
- package/evals/cases/dev/code-review.yaml +44 -0
- package/evals/cases/dev/dashboard.html +300 -0
- package/evals/cases/dev/deliver.yaml +66 -0
- package/evals/cases/dev/dependency-update.yaml +16 -0
- package/evals/cases/dev/explore.yaml +20 -0
- package/evals/cases/dev/index.html +370 -0
- package/evals/cases/dev/package-lock.json +28 -0
- package/evals/cases/dev/package.json +16 -0
- package/evals/cases/dev/plan-work.yaml +20 -0
- package/evals/cases/dev/promptfooconfig.yaml +666 -0
- package/evals/cases/dev/search-first.yaml +20 -0
- package/evals/cases/dev/tdd-workflow.yaml +48 -0
- package/evals/cases/dev/verify-work.yaml +44 -0
- package/evals/cases/dev/workflow.yaml +34 -0
- package/evals/ci/run-baseline.sh +283 -0
- package/evals/fixtures/backlog-provider-settings/global-default.json +44 -0
- package/evals/fixtures/backlog-provider-settings/project-override.json +53 -0
- package/evals/fixtures/builder-kit-workflow-state/baseline-freshness-resolution-hint.json +139 -0
- package/evals/fixtures/builder-kit-workflow-state/direct-primitive-stop.json +59 -0
- package/evals/fixtures/builder-kit-workflow-state/empty-board-route-shape.json +55 -0
- package/evals/fixtures/builder-kit-workflow-state/happy-path.json +71 -0
- package/evals/fixtures/builder-kit-workflow-state/mid-work-resume.json +80 -0
- package/evals/fixtures/builder-kit-workflow-state/missing-prestep-recovery.json +65 -0
- package/evals/fixtures/builder-kit-workflow-state/product-build-chaining.json +60 -0
- package/evals/fixtures/builder-kit-workflow-state/stale-continuation-requires-new-probe.json +57 -0
- package/evals/fixtures/console-learning-projection/artifacts/console-learning-correction/learning.json +50 -0
- package/evals/fixtures/console-learning-projection/artifacts/console-learning-open-route/learning.json +41 -0
- package/evals/fixtures/flow-kit-repository/invalid-absolute-path/kit.json +8 -0
- package/evals/fixtures/flow-kit-repository/invalid-asset-section/flows/review.flow.json +6 -0
- package/evals/fixtures/flow-kit-repository/invalid-asset-section/kit.json +11 -0
- package/evals/fixtures/flow-kit-repository/invalid-duplicate-flow/flows/review.flow.json +6 -0
- package/evals/fixtures/flow-kit-repository/invalid-duplicate-flow/kit.json +9 -0
- package/evals/fixtures/flow-kit-repository/invalid-id/flows/review.flow.json +6 -0
- package/evals/fixtures/flow-kit-repository/invalid-id/kit.json +8 -0
- package/evals/fixtures/flow-kit-repository/invalid-malformed-json/kit.json +8 -0
- package/evals/fixtures/flow-kit-repository/invalid-missing-flow/kit.json +8 -0
- package/evals/fixtures/flow-kit-repository/invalid-missing-id/flows/review.flow.json +6 -0
- package/evals/fixtures/flow-kit-repository/invalid-missing-id/kit.json +7 -0
- package/evals/fixtures/flow-kit-repository/invalid-missing-schema-version/flows/review.flow.json +6 -0
- package/evals/fixtures/flow-kit-repository/invalid-missing-schema-version/kit.json +7 -0
- package/evals/fixtures/flow-kit-repository/invalid-name/flows/review.flow.json +6 -0
- package/evals/fixtures/flow-kit-repository/invalid-name/kit.json +8 -0
- package/evals/fixtures/flow-kit-repository/invalid-schema-version/flows/review.flow.json +6 -0
- package/evals/fixtures/flow-kit-repository/invalid-schema-version/kit.json +8 -0
- package/evals/fixtures/flow-kit-repository/invalid-traversal/kit.json +8 -0
- package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/adapters/example.json +3 -0
- package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/assets/example.txt +1 -0
- package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/docs/README.md +3 -0
- package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/flows/runtime.flow.json +26 -0
- package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/kit-evals/example.json +3 -0
- package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/kit-skills/mixed/SKILL.md +3 -0
- package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/kit.json +44 -0
- package/evals/fixtures/flow-kit-repository/valid-local-kit/docs/README.md +3 -0
- package/evals/fixtures/flow-kit-repository/valid-local-kit/flows/review.flow.json +26 -0
- package/evals/fixtures/flow-kit-repository/valid-local-kit/kit.json +20 -0
- package/evals/fixtures/hook-influence/cases.json +336 -0
- package/evals/fixtures/pull-work-provider/github-issues.json +170 -0
- package/evals/fixtures/pull-work-wip-shepherding/global-wip-informs.json +43 -0
- package/evals/fixtures/pull-work-wip-shepherding/personal-wip-blocks.json +42 -0
- package/evals/fixtures/surface-trust/accepted-claim-trust-report.json +31 -0
- package/evals/fixtures/surface-trust/artifact-absent.json +19 -0
- package/evals/fixtures/surface-trust/integrity-mismatch-trust-report.json +32 -0
- package/evals/fixtures/surface-trust/missing-authority-trust-report.json +27 -0
- package/evals/fixtures/surface-trust/provider-absent.json +19 -0
- package/evals/fixtures/surface-trust/rejected-claim-trust-report.json +30 -0
- package/evals/fixtures/surface-trust/stale-claim-trust-snapshot.json +31 -0
- package/evals/fixtures/usage-feedback/sample-full.jsonl +11 -0
- package/evals/fixtures/usage-feedback/sample-outcomes.jsonl +1 -0
- package/evals/fixtures/veritas-governance-adapter/fake-veritas-pass.sh +18 -0
- package/evals/fixtures/veritas-governance-adapter/fake-veritas-secret-fail.sh +10 -0
- package/evals/fixtures/veritas-governance-adapter/fake-veritas-unconfigured.sh +4 -0
- package/evals/integration/test_bundle_install.sh +541 -0
- package/evals/integration/test_console_learning_projection.sh +192 -0
- package/evals/integration/test_context_map.sh +65 -0
- package/evals/integration/test_effective_backlog_settings.sh +58 -0
- package/evals/integration/test_fixture_retirement_audit.sh +58 -0
- package/evals/integration/test_flow_agents_statusline.sh +93 -0
- package/evals/integration/test_flow_kit_repository.sh +90 -0
- package/evals/integration/test_goal_fit_hook.sh +482 -0
- package/evals/integration/test_hook_category_behaviors.sh +190 -0
- package/evals/integration/test_hook_influence_cases.sh +69 -0
- package/evals/integration/test_local_flow_kit_install.sh +145 -0
- package/evals/integration/test_publish_change_helper.sh +176 -0
- package/evals/integration/test_pull_work_provider.sh +140 -0
- package/evals/integration/test_runtime_adapter_activation.sh +106 -0
- package/evals/integration/test_telemetry.sh +485 -0
- package/evals/integration/test_telemetry_doctor.sh +193 -0
- package/evals/integration/test_usage_feedback_dashboard.sh +169 -0
- package/evals/integration/test_usage_feedback_global.sh +117 -0
- package/evals/integration/test_usage_feedback_import.sh +227 -0
- package/evals/integration/test_usage_feedback_outcomes.sh +165 -0
- package/evals/integration/test_usage_feedback_report.sh +263 -0
- package/evals/integration/test_veritas_governance_adapter.sh +235 -0
- package/evals/integration/test_workflow_artifact_cleanup_audit.sh +287 -0
- package/evals/integration/test_workflow_artifacts.sh +1247 -0
- package/evals/integration/test_workflow_sidecar_writer.sh +2112 -0
- package/evals/integration/test_workflow_steering_hook.sh +337 -0
- package/evals/lib/assertions/delegated-to.js +40 -0
- package/evals/lib/assertions/max-tool-calls.js +15 -0
- package/evals/lib/assertions/no-write-tools.js +27 -0
- package/evals/lib/assertions/pass-at-k.js +39 -0
- package/evals/lib/assertions/telemetry-utils.js +105 -0
- package/evals/lib/assertions/tool-called.js +39 -0
- package/evals/lib/assertions/verify-after-fix.js +61 -0
- package/evals/lib/claude-judge.sh +40 -0
- package/evals/lib/claude-provider.sh +74 -0
- package/evals/lib/codex-judge.sh +39 -0
- package/evals/lib/codex-provider.sh +81 -0
- package/evals/lib/eval-dev.sh +5 -0
- package/evals/lib/eval-judge.sh +22 -0
- package/evals/lib/eval-provider.sh +26 -0
- package/evals/lib/eval-report.sh +73 -0
- package/evals/lib/kiro-dev.sh +4 -0
- package/evals/lib/kiro-judge.sh +17 -0
- package/evals/lib/kiro-provider.sh +62 -0
- package/evals/lib/node.sh +111 -0
- package/evals/promptfooconfig.yaml +70 -0
- package/evals/run.sh +309 -0
- package/evals/static/test_evidence_refs.sh +141 -0
- package/evals/static/test_package.sh +407 -0
- package/evals/static/test_repo_hooks.sh +68 -0
- package/evals/static/test_universal_bundles.sh +274 -0
- package/evals/static/test_workflow_skills.sh +1207 -0
- package/install.sh +64 -0
- package/integrations/veritas/flow-agents.adapter.json +138 -0
- package/integrations/veritas/flow-agents.authority-settings.json +26 -0
- package/integrations/veritas/flow-agents.repo-standards.json +82 -0
- package/kits/builder/flows/build.flow.json +218 -0
- package/kits/builder/flows/shape.flow.json +127 -0
- package/kits/builder/kit.json +19 -0
- package/kits/catalog.json +11 -0
- package/package.json +130 -0
- package/packaging/README.md +60 -0
- package/packaging/manifest.json +173 -0
- package/packaging/packs.json +69 -0
- package/powers/dependency-checker/POWER.md +20 -0
- package/powers/dependency-checker/mcp.json +20 -0
- package/powers/playwright/POWER.md +25 -0
- package/powers/playwright/mcp.json +12 -0
- package/prompts/code-audit.md +123 -0
- package/prompts/kcommit.md +88 -0
- package/schemas/backlog-provider-settings.schema.json +138 -0
- package/schemas/workflow-acceptance.schema.json +216 -0
- package/schemas/workflow-critique.schema.json +113 -0
- package/schemas/workflow-evidence.schema.json +357 -0
- package/schemas/workflow-handoff.schema.json +52 -0
- package/schemas/workflow-learning.schema.json +223 -0
- package/schemas/workflow-release.schema.json +172 -0
- package/schemas/workflow-state.schema.json +80 -0
- package/scripts/README.md +111 -0
- package/scripts/build-universal-bundles.js +3 -0
- package/scripts/check-content-boundary.cjs +99 -0
- package/scripts/context-budget/budget-scan.sh +166 -0
- package/scripts/detect-tools.sh +3 -0
- package/scripts/discover-agents.sh +28 -0
- package/scripts/effective-backlog-settings.js +2 -0
- package/scripts/filter-installed-packs.js +2 -0
- package/scripts/flow-kit.js +2 -0
- package/scripts/generate-context-map.js +2 -0
- package/scripts/git-status.sh +49 -0
- package/scripts/hooks/claude-hook-adapter.js +174 -0
- package/scripts/hooks/claude-telemetry-hook.js +115 -0
- package/scripts/hooks/codex-hook-adapter.js +176 -0
- package/scripts/hooks/codex-telemetry-hook.js +95 -0
- package/scripts/hooks/config-protection.js +79 -0
- package/scripts/hooks/desktop-notify.sh +39 -0
- package/scripts/hooks/governance-audit.sh +135 -0
- package/scripts/hooks/lib/audit-transport.sh +40 -0
- package/scripts/hooks/lib/hook-flags.js +49 -0
- package/scripts/hooks/lib/patterns.sh +57 -0
- package/scripts/hooks/lib/resolve-formatter.js +80 -0
- package/scripts/hooks/post-edit-accumulator.js +66 -0
- package/scripts/hooks/pre-commit-quality.js +194 -0
- package/scripts/hooks/quality-gate.js +93 -0
- package/scripts/hooks/report-only-guard.js +21 -0
- package/scripts/hooks/run-hook.js +136 -0
- package/scripts/hooks/stop-format-typecheck.js +141 -0
- package/scripts/hooks/stop-goal-fit.js +337 -0
- package/scripts/hooks/workflow-steering.js +250 -0
- package/scripts/install-codex-home.sh +106 -0
- package/scripts/package.json +3 -0
- package/scripts/promote-workflow-artifact.js +2 -0
- package/scripts/publish-change-helper.js +2 -0
- package/scripts/pull-work-provider.js +2 -0
- package/scripts/setup-repo-hooks.sh +8 -0
- package/scripts/statusline/flow-agents-statusline.js +157 -0
- package/scripts/telemetry/console-presets.sh +14 -0
- package/scripts/telemetry/install-console-config.sh +214 -0
- package/scripts/telemetry/lib/config.sh +85 -0
- package/scripts/telemetry/lib/enrich.sh +115 -0
- package/scripts/telemetry/lib/redact.sh +22 -0
- package/scripts/telemetry/lib/session.sh +63 -0
- package/scripts/telemetry/lib/transport.sh +183 -0
- package/scripts/telemetry/lib/usage.sh +29 -0
- package/scripts/telemetry/sync-agents.sh +173 -0
- package/scripts/telemetry/telemetry.conf +23 -0
- package/scripts/telemetry/telemetry.sh +387 -0
- package/scripts/usage-feedback.js +2 -0
- package/scripts/validate-hook-influence-cases.js +2 -0
- package/scripts/validate-package.sh +89 -0
- package/scripts/validate-source-tree.js +9 -0
- package/skills/agentic-engineering/SKILL.md +62 -0
- package/skills/browser-test/SKILL.md +51 -0
- package/skills/builder-shape/SKILL.md +76 -0
- package/skills/context-budget/SKILL.md +40 -0
- package/skills/deliver/SKILL.md +241 -0
- package/skills/dependency-update/SKILL.md +68 -0
- package/skills/design-probe/SKILL.md +107 -0
- package/skills/eval-rebuild/SKILL.md +39 -0
- package/skills/evidence-gate/SKILL.md +186 -0
- package/skills/execute-plan/SKILL.md +110 -0
- package/skills/explore/SKILL.md +137 -0
- package/skills/feedback-loop/SKILL.md +87 -0
- package/skills/fix-bug/SKILL.md +133 -0
- package/skills/frontend-design/SKILL.md +80 -0
- package/skills/github-cli/SKILL.md +63 -0
- package/skills/idea-to-backlog/SKILL.md +267 -0
- package/skills/knowledge-capture/SKILL.md +55 -0
- package/skills/learning-review/SKILL.md +115 -0
- package/skills/pickup-probe/SKILL.md +114 -0
- package/skills/plan-work/SKILL.md +176 -0
- package/skills/pull-work/SKILL.md +309 -0
- package/skills/release-readiness/SKILL.md +121 -0
- package/skills/review-work/SKILL.md +161 -0
- package/skills/search-first/SKILL.md +66 -0
- package/skills/tdd-workflow/SKILL.md +140 -0
- package/skills/verify-work/SKILL.md +109 -0
- package/src/cli/console-learning-projection.ts +140 -0
- package/src/cli/effective-backlog-settings.ts +99 -0
- package/src/cli/fixture-retirement-audit.ts +154 -0
- package/src/cli/flow-kit.ts +139 -0
- package/src/cli/init.ts +248 -0
- package/src/cli/promote-workflow-artifact.ts +64 -0
- package/src/cli/publish-change-helper.ts +143 -0
- package/src/cli/pull-work-provider.ts +481 -0
- package/src/cli/runtime-adapter.ts +24 -0
- package/src/cli/telemetry-doctor.ts +243 -0
- package/src/cli/usage-feedback.ts +418 -0
- package/src/cli/validate-hook-influence.ts +119 -0
- package/src/cli/validate-source-tree.ts +30 -0
- package/src/cli/validate-workflow-artifacts.ts +411 -0
- package/src/cli/veritas-governance.ts +322 -0
- package/src/cli/workflow-artifact-cleanup-audit.ts +281 -0
- package/src/cli/workflow-sidecar.ts +676 -0
- package/src/cli.ts +95 -0
- package/src/flow-kit/validate.ts +74 -0
- package/src/lib/args.ts +43 -0
- package/src/lib/fs.ts +62 -0
- package/src/lib/workflow-learning-projection.ts +491 -0
- package/src/runtime-adapters.ts +154 -0
- package/src/tools/build-universal-bundles.ts +366 -0
- package/src/tools/common.ts +61 -0
- package/src/tools/filter-installed-packs.ts +129 -0
- package/src/tools/generate-context-map.ts +199 -0
- package/src/tools/validate-package.ts +57 -0
- package/src/tools/validate-source-tree.ts +488 -0
- package/tsconfig.json +19 -0
- 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"
|