@kontourai/flow-agents 4.0.0 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/ci.yml +8 -0
- package/CHANGELOG.md +27 -0
- package/CONTEXT.md +5 -0
- package/agents/tool-security-reviewer.json +1 -1
- package/build/src/cli/init.js +35 -3
- package/build/src/cli/kit.js +95 -2
- package/build/src/cli/pull-work-provider.js +7 -1
- package/build/src/cli/validate-workflow-artifacts.js +53 -0
- package/build/src/cli/workflow.js +5 -1
- package/build/src/flow-kit/provision.d.ts +23 -0
- package/build/src/flow-kit/provision.js +99 -0
- package/build/src/flow-kit/validate.d.ts +52 -0
- package/build/src/flow-kit/validate.js +214 -9
- package/build/src/runtime-adapters.js +1 -1
- package/context/contracts/execution-contract.md +30 -1
- package/context/contracts/review-contract.md +4 -0
- package/context/contracts/trigger-guards.md +73 -0
- package/context/settings/backlog-provider-settings.json +1 -1
- package/context/settings/workspace-backlog-provider-settings.example.json +1 -1
- package/dist/base/build/package.json +1 -1
- package/dist/base/build/src/cli/init.js +35 -3
- package/dist/base/build/src/cli/kit.js +95 -2
- package/dist/base/build/src/cli/pull-work-provider.js +7 -1
- package/dist/base/build/src/cli/validate-workflow-artifacts.js +53 -0
- package/dist/base/build/src/cli/workflow.js +5 -1
- package/dist/base/build/src/flow-kit/provision.d.ts +23 -0
- package/dist/base/build/src/flow-kit/provision.js +99 -0
- package/dist/base/build/src/flow-kit/validate.d.ts +52 -0
- package/dist/base/build/src/flow-kit/validate.js +214 -9
- package/dist/base/build/src/runtime-adapters.js +1 -1
- package/dist/base/context/contracts/execution-contract.md +30 -1
- package/dist/base/context/contracts/review-contract.md +4 -0
- package/dist/base/context/contracts/trigger-guards.md +73 -0
- package/dist/base/context/settings/backlog-provider-settings.json +1 -1
- package/dist/base/context/settings/workspace-backlog-provider-settings.example.json +1 -1
- package/dist/base/docs/adr/0023-kit-provisioning.md +47 -0
- package/dist/base/docs/adr/index.md +1 -0
- package/dist/base/docs/architecture-engine-and-kits.md +17 -0
- package/dist/base/docs/context-map.md +3 -0
- package/dist/base/docs/decisions/backlog-readiness-source.md +89 -0
- package/dist/base/docs/decisions/index.md +1 -0
- package/dist/base/docs/developer-architecture.md +3 -3
- package/dist/base/docs/flow-kit-repository-contract.md +34 -3
- package/dist/base/docs/kit-authoring-guide.md +1 -1
- package/dist/base/docs/veritas-integration.md +12 -0
- package/dist/base/evals/ci/run-baseline.sh +4 -0
- package/dist/base/evals/integration/test_kit_provisioning.sh +112 -0
- package/dist/base/evals/integration/test_pull_work_provider.sh +18 -0
- package/dist/base/evals/integration/test_veritas_governance_kit.sh +256 -0
- package/dist/base/evals/integration/test_workflow_artifacts.sh +257 -0
- package/dist/base/evals/static/test_package.sh +6 -0
- package/dist/base/evals/static/test_workflow_skills.sh +16 -0
- package/dist/base/install.sh +1 -1
- package/dist/base/kits/builder/flows/publish-learn.flow.json +9 -1
- package/dist/base/kits/builder/skills/execute-plan/SKILL.md +4 -3
- package/dist/base/kits/builder/skills/pull-work/SKILL.md +12 -0
- package/dist/base/kits/builder/skills/review-work/SKILL.md +11 -0
- package/dist/base/kits/veritas-governance/adapter/readiness-to-trust-bundle.mjs +19 -20
- package/dist/base/kits/veritas-governance/assets/starter-hooks/githooks/post-commit +13 -0
- package/dist/base/kits/veritas-governance/assets/starter-hooks/githooks/pre-push +13 -0
- package/dist/base/kits/veritas-governance/assets/starter-standards/veritas/GOVERNANCE.md +23 -0
- package/dist/base/kits/veritas-governance/assets/starter-standards/veritas/README.md +58 -0
- package/dist/base/kits/veritas-governance/assets/starter-standards/veritas/authority/default.authority-settings.json +30 -0
- package/dist/base/kits/veritas-governance/assets/starter-standards/veritas/repo-map.json +115 -0
- package/dist/base/kits/veritas-governance/assets/starter-standards/veritas/repo-standards/default.repo-standards.json +54 -0
- package/dist/base/kits/veritas-governance/assets/starter-standards/veritas.claims.json +179 -0
- package/dist/base/kits/veritas-governance/docs/README.md +141 -10
- package/dist/base/kits/veritas-governance/fixtures/standards-authoring/approved.trust-bundle.json +74 -0
- package/dist/base/kits/veritas-governance/fixtures/standards-authoring/not-approved.trust-bundle.json +74 -0
- package/dist/base/kits/veritas-governance/flows/standards-authoring.flow.json +35 -0
- package/dist/base/kits/veritas-governance/kit.json +65 -0
- package/dist/base/kits/veritas-governance/skills/consult-standards/SKILL.md +73 -0
- package/dist/base/kits/veritas-governance/skills/standards-authoring/SKILL.md +87 -0
- package/dist/base/schemas/backlog-provider-settings.schema.json +1 -1
- package/dist/base/schemas/workflow-waves.schema.json +347 -0
- package/dist/base/scripts/check-layer-boundary.mjs +98 -0
- package/dist/catalog.json +2 -0
- package/dist/claude-code/.claude/agents/tool-security-reviewer.md +2 -1
- package/dist/claude-code/.claude/skills/consult-standards/SKILL.md +73 -0
- package/dist/claude-code/.claude/skills/execute-plan/SKILL.md +4 -3
- package/dist/claude-code/.claude/skills/pull-work/SKILL.md +12 -0
- package/dist/claude-code/.claude/skills/review-work/SKILL.md +11 -0
- package/dist/claude-code/.claude/skills/standards-authoring/SKILL.md +87 -0
- package/dist/claude-code/build/package.json +1 -1
- package/dist/claude-code/build/src/cli/init.js +35 -3
- package/dist/claude-code/build/src/cli/kit.js +95 -2
- package/dist/claude-code/build/src/cli/pull-work-provider.js +7 -1
- package/dist/claude-code/build/src/cli/validate-workflow-artifacts.js +53 -0
- package/dist/claude-code/build/src/cli/workflow.js +5 -1
- package/dist/claude-code/build/src/flow-kit/provision.d.ts +23 -0
- package/dist/claude-code/build/src/flow-kit/provision.js +99 -0
- package/dist/claude-code/build/src/flow-kit/validate.d.ts +52 -0
- package/dist/claude-code/build/src/flow-kit/validate.js +214 -9
- package/dist/claude-code/build/src/runtime-adapters.js +1 -1
- package/dist/claude-code/context/contracts/execution-contract.md +30 -1
- package/dist/claude-code/context/contracts/review-contract.md +4 -0
- package/dist/claude-code/context/contracts/trigger-guards.md +73 -0
- package/dist/claude-code/context/settings/backlog-provider-settings.json +1 -1
- package/dist/claude-code/context/settings/workspace-backlog-provider-settings.example.json +1 -1
- package/dist/claude-code/docs/adr/0023-kit-provisioning.md +47 -0
- package/dist/claude-code/docs/adr/index.md +1 -0
- package/dist/claude-code/docs/architecture-engine-and-kits.md +17 -0
- package/dist/claude-code/docs/context-map.md +3 -0
- package/dist/claude-code/docs/decisions/backlog-readiness-source.md +89 -0
- package/dist/claude-code/docs/decisions/index.md +1 -0
- package/dist/claude-code/docs/developer-architecture.md +3 -3
- package/dist/claude-code/docs/flow-kit-repository-contract.md +34 -3
- package/dist/claude-code/docs/kit-authoring-guide.md +1 -1
- package/dist/claude-code/docs/veritas-integration.md +12 -0
- package/dist/claude-code/evals/ci/run-baseline.sh +4 -0
- package/dist/claude-code/evals/integration/test_kit_provisioning.sh +112 -0
- package/dist/claude-code/evals/integration/test_pull_work_provider.sh +18 -0
- package/dist/claude-code/evals/integration/test_veritas_governance_kit.sh +256 -0
- package/dist/claude-code/evals/integration/test_workflow_artifacts.sh +257 -0
- package/dist/claude-code/evals/static/test_package.sh +6 -0
- package/dist/claude-code/evals/static/test_workflow_skills.sh +16 -0
- package/dist/claude-code/install.sh +1 -1
- package/dist/claude-code/kits/builder/flows/publish-learn.flow.json +9 -1
- package/dist/claude-code/kits/builder/skills/execute-plan/SKILL.md +4 -3
- package/dist/claude-code/kits/builder/skills/pull-work/SKILL.md +12 -0
- package/dist/claude-code/kits/builder/skills/review-work/SKILL.md +11 -0
- package/dist/claude-code/kits/veritas-governance/adapter/readiness-to-trust-bundle.mjs +19 -20
- package/dist/claude-code/kits/veritas-governance/assets/starter-hooks/githooks/post-commit +13 -0
- package/dist/claude-code/kits/veritas-governance/assets/starter-hooks/githooks/pre-push +13 -0
- package/dist/claude-code/kits/veritas-governance/assets/starter-standards/veritas/GOVERNANCE.md +23 -0
- package/dist/claude-code/kits/veritas-governance/assets/starter-standards/veritas/README.md +58 -0
- package/dist/claude-code/kits/veritas-governance/assets/starter-standards/veritas/authority/default.authority-settings.json +30 -0
- package/dist/claude-code/kits/veritas-governance/assets/starter-standards/veritas/repo-map.json +115 -0
- package/dist/claude-code/kits/veritas-governance/assets/starter-standards/veritas/repo-standards/default.repo-standards.json +54 -0
- package/dist/claude-code/kits/veritas-governance/assets/starter-standards/veritas.claims.json +179 -0
- package/dist/claude-code/kits/veritas-governance/docs/README.md +141 -10
- package/dist/claude-code/kits/veritas-governance/fixtures/standards-authoring/approved.trust-bundle.json +74 -0
- package/dist/claude-code/kits/veritas-governance/fixtures/standards-authoring/not-approved.trust-bundle.json +74 -0
- package/dist/claude-code/kits/veritas-governance/flows/standards-authoring.flow.json +35 -0
- package/dist/claude-code/kits/veritas-governance/kit.json +65 -0
- package/dist/claude-code/kits/veritas-governance/skills/consult-standards/SKILL.md +73 -0
- package/dist/claude-code/kits/veritas-governance/skills/standards-authoring/SKILL.md +87 -0
- package/dist/claude-code/schemas/backlog-provider-settings.schema.json +1 -1
- package/dist/claude-code/schemas/workflow-waves.schema.json +347 -0
- package/dist/claude-code/scripts/check-layer-boundary.mjs +98 -0
- package/dist/codex/.agents/skills/builder-shape/context/contracts/execution-contract.md +30 -1
- package/dist/codex/.agents/skills/consult-standards/SKILL.md +73 -0
- package/dist/codex/.agents/skills/deliver/context/contracts/execution-contract.md +30 -1
- package/dist/codex/.agents/skills/design-probe/context/contracts/execution-contract.md +30 -1
- package/dist/codex/.agents/skills/execute-plan/SKILL.md +4 -3
- package/dist/codex/.agents/skills/execute-plan/context/contracts/execution-contract.md +30 -1
- package/dist/codex/.agents/skills/fix-bug/context/contracts/execution-contract.md +30 -1
- package/dist/codex/.agents/skills/idea-to-backlog/context/contracts/execution-contract.md +30 -1
- package/dist/codex/.agents/skills/plan-work/context/contracts/execution-contract.md +30 -1
- package/dist/codex/.agents/skills/pull-work/SKILL.md +12 -0
- package/dist/codex/.agents/skills/pull-work/context/contracts/execution-contract.md +30 -1
- package/dist/codex/.agents/skills/review-work/SKILL.md +11 -0
- package/dist/codex/.agents/skills/review-work/context/contracts/execution-contract.md +30 -1
- package/dist/codex/.agents/skills/standards-authoring/SKILL.md +87 -0
- package/dist/codex/.agents/skills/tdd-workflow/context/contracts/execution-contract.md +30 -1
- package/dist/codex/.agents/skills/verify-work/context/contracts/execution-contract.md +30 -1
- package/dist/codex/.codex/agents/tool-security-reviewer.toml +1 -1
- package/dist/codex/build/package.json +1 -1
- package/dist/codex/build/src/cli/init.js +35 -3
- package/dist/codex/build/src/cli/kit.js +95 -2
- package/dist/codex/build/src/cli/pull-work-provider.js +7 -1
- package/dist/codex/build/src/cli/validate-workflow-artifacts.js +53 -0
- package/dist/codex/build/src/cli/workflow.js +5 -1
- package/dist/codex/build/src/flow-kit/provision.d.ts +23 -0
- package/dist/codex/build/src/flow-kit/provision.js +99 -0
- package/dist/codex/build/src/flow-kit/validate.d.ts +52 -0
- package/dist/codex/build/src/flow-kit/validate.js +214 -9
- package/dist/codex/build/src/runtime-adapters.js +1 -1
- package/dist/codex/context/contracts/execution-contract.md +30 -1
- package/dist/codex/context/contracts/review-contract.md +4 -0
- package/dist/codex/context/contracts/trigger-guards.md +73 -0
- package/dist/codex/context/settings/backlog-provider-settings.json +1 -1
- package/dist/codex/context/settings/workspace-backlog-provider-settings.example.json +1 -1
- package/dist/codex/docs/adr/0023-kit-provisioning.md +47 -0
- package/dist/codex/docs/adr/index.md +1 -0
- package/dist/codex/docs/architecture-engine-and-kits.md +17 -0
- package/dist/codex/docs/context-map.md +3 -0
- package/dist/codex/docs/decisions/backlog-readiness-source.md +89 -0
- package/dist/codex/docs/decisions/index.md +1 -0
- package/dist/codex/docs/developer-architecture.md +3 -3
- package/dist/codex/docs/flow-kit-repository-contract.md +34 -3
- package/dist/codex/docs/kit-authoring-guide.md +1 -1
- package/dist/codex/docs/veritas-integration.md +12 -0
- package/dist/codex/evals/ci/run-baseline.sh +4 -0
- package/dist/codex/evals/integration/test_kit_provisioning.sh +112 -0
- package/dist/codex/evals/integration/test_pull_work_provider.sh +18 -0
- package/dist/codex/evals/integration/test_veritas_governance_kit.sh +256 -0
- package/dist/codex/evals/integration/test_workflow_artifacts.sh +257 -0
- package/dist/codex/evals/static/test_package.sh +6 -0
- package/dist/codex/evals/static/test_workflow_skills.sh +16 -0
- package/dist/codex/install.sh +1 -1
- package/dist/codex/kits/builder/flows/publish-learn.flow.json +9 -1
- package/dist/codex/kits/builder/skills/execute-plan/SKILL.md +4 -3
- package/dist/codex/kits/builder/skills/pull-work/SKILL.md +12 -0
- package/dist/codex/kits/builder/skills/review-work/SKILL.md +11 -0
- package/dist/codex/kits/veritas-governance/adapter/readiness-to-trust-bundle.mjs +19 -20
- package/dist/codex/kits/veritas-governance/assets/starter-hooks/githooks/post-commit +13 -0
- package/dist/codex/kits/veritas-governance/assets/starter-hooks/githooks/pre-push +13 -0
- package/dist/codex/kits/veritas-governance/assets/starter-standards/veritas/GOVERNANCE.md +23 -0
- package/dist/codex/kits/veritas-governance/assets/starter-standards/veritas/README.md +58 -0
- package/dist/codex/kits/veritas-governance/assets/starter-standards/veritas/authority/default.authority-settings.json +30 -0
- package/dist/codex/kits/veritas-governance/assets/starter-standards/veritas/repo-map.json +115 -0
- package/dist/codex/kits/veritas-governance/assets/starter-standards/veritas/repo-standards/default.repo-standards.json +54 -0
- package/dist/codex/kits/veritas-governance/assets/starter-standards/veritas.claims.json +179 -0
- package/dist/codex/kits/veritas-governance/docs/README.md +141 -10
- package/dist/codex/kits/veritas-governance/fixtures/standards-authoring/approved.trust-bundle.json +74 -0
- package/dist/codex/kits/veritas-governance/fixtures/standards-authoring/not-approved.trust-bundle.json +74 -0
- package/dist/codex/kits/veritas-governance/flows/standards-authoring.flow.json +35 -0
- package/dist/codex/kits/veritas-governance/kit.json +65 -0
- package/dist/codex/kits/veritas-governance/skills/consult-standards/SKILL.md +73 -0
- package/dist/codex/kits/veritas-governance/skills/standards-authoring/SKILL.md +87 -0
- package/dist/codex/schemas/backlog-provider-settings.schema.json +1 -1
- package/dist/codex/schemas/workflow-waves.schema.json +347 -0
- package/dist/codex/scripts/check-layer-boundary.mjs +98 -0
- package/dist/kiro/agents/tool-security-reviewer.json +1 -1
- package/dist/kiro/build/package.json +1 -1
- package/dist/kiro/build/src/cli/init.js +35 -3
- package/dist/kiro/build/src/cli/kit.js +95 -2
- package/dist/kiro/build/src/cli/pull-work-provider.js +7 -1
- package/dist/kiro/build/src/cli/validate-workflow-artifacts.js +53 -0
- package/dist/kiro/build/src/cli/workflow.js +5 -1
- package/dist/kiro/build/src/flow-kit/provision.d.ts +23 -0
- package/dist/kiro/build/src/flow-kit/provision.js +99 -0
- package/dist/kiro/build/src/flow-kit/validate.d.ts +52 -0
- package/dist/kiro/build/src/flow-kit/validate.js +214 -9
- package/dist/kiro/build/src/runtime-adapters.js +1 -1
- package/dist/kiro/context/contracts/execution-contract.md +30 -1
- package/dist/kiro/context/contracts/review-contract.md +4 -0
- package/dist/kiro/context/contracts/trigger-guards.md +73 -0
- package/dist/kiro/context/settings/backlog-provider-settings.json +1 -1
- package/dist/kiro/context/settings/workspace-backlog-provider-settings.example.json +1 -1
- package/dist/kiro/docs/adr/0023-kit-provisioning.md +47 -0
- package/dist/kiro/docs/adr/index.md +1 -0
- package/dist/kiro/docs/architecture-engine-and-kits.md +17 -0
- package/dist/kiro/docs/context-map.md +3 -0
- package/dist/kiro/docs/decisions/backlog-readiness-source.md +89 -0
- package/dist/kiro/docs/decisions/index.md +1 -0
- package/dist/kiro/docs/developer-architecture.md +3 -3
- package/dist/kiro/docs/flow-kit-repository-contract.md +34 -3
- package/dist/kiro/docs/kit-authoring-guide.md +1 -1
- package/dist/kiro/docs/veritas-integration.md +12 -0
- package/dist/kiro/evals/ci/run-baseline.sh +4 -0
- package/dist/kiro/evals/integration/test_kit_provisioning.sh +112 -0
- package/dist/kiro/evals/integration/test_pull_work_provider.sh +18 -0
- package/dist/kiro/evals/integration/test_veritas_governance_kit.sh +256 -0
- package/dist/kiro/evals/integration/test_workflow_artifacts.sh +257 -0
- package/dist/kiro/evals/static/test_package.sh +6 -0
- package/dist/kiro/evals/static/test_workflow_skills.sh +16 -0
- package/dist/kiro/install.sh +1 -1
- package/dist/kiro/kits/builder/flows/publish-learn.flow.json +9 -1
- package/dist/kiro/kits/builder/skills/execute-plan/SKILL.md +4 -3
- package/dist/kiro/kits/builder/skills/pull-work/SKILL.md +12 -0
- package/dist/kiro/kits/builder/skills/review-work/SKILL.md +11 -0
- package/dist/kiro/kits/veritas-governance/adapter/readiness-to-trust-bundle.mjs +19 -20
- package/dist/kiro/kits/veritas-governance/assets/starter-hooks/githooks/post-commit +13 -0
- package/dist/kiro/kits/veritas-governance/assets/starter-hooks/githooks/pre-push +13 -0
- package/dist/kiro/kits/veritas-governance/assets/starter-standards/veritas/GOVERNANCE.md +23 -0
- package/dist/kiro/kits/veritas-governance/assets/starter-standards/veritas/README.md +58 -0
- package/dist/kiro/kits/veritas-governance/assets/starter-standards/veritas/authority/default.authority-settings.json +30 -0
- package/dist/kiro/kits/veritas-governance/assets/starter-standards/veritas/repo-map.json +115 -0
- package/dist/kiro/kits/veritas-governance/assets/starter-standards/veritas/repo-standards/default.repo-standards.json +54 -0
- package/dist/kiro/kits/veritas-governance/assets/starter-standards/veritas.claims.json +179 -0
- package/dist/kiro/kits/veritas-governance/docs/README.md +141 -10
- package/dist/kiro/kits/veritas-governance/fixtures/standards-authoring/approved.trust-bundle.json +74 -0
- package/dist/kiro/kits/veritas-governance/fixtures/standards-authoring/not-approved.trust-bundle.json +74 -0
- package/dist/kiro/kits/veritas-governance/flows/standards-authoring.flow.json +35 -0
- package/dist/kiro/kits/veritas-governance/kit.json +65 -0
- package/dist/kiro/kits/veritas-governance/skills/consult-standards/SKILL.md +73 -0
- package/dist/kiro/kits/veritas-governance/skills/standards-authoring/SKILL.md +87 -0
- package/dist/kiro/schemas/backlog-provider-settings.schema.json +1 -1
- package/dist/kiro/schemas/workflow-waves.schema.json +347 -0
- package/dist/kiro/scripts/check-layer-boundary.mjs +98 -0
- package/dist/opencode/.opencode/agents/tool-security-reviewer.md +2 -1
- package/dist/opencode/.opencode/skills/consult-standards/SKILL.md +73 -0
- package/dist/opencode/.opencode/skills/execute-plan/SKILL.md +4 -3
- package/dist/opencode/.opencode/skills/pull-work/SKILL.md +12 -0
- package/dist/opencode/.opencode/skills/review-work/SKILL.md +11 -0
- package/dist/opencode/.opencode/skills/standards-authoring/SKILL.md +87 -0
- package/dist/opencode/build/package.json +1 -1
- package/dist/opencode/build/src/cli/init.js +35 -3
- package/dist/opencode/build/src/cli/kit.js +95 -2
- package/dist/opencode/build/src/cli/pull-work-provider.js +7 -1
- package/dist/opencode/build/src/cli/validate-workflow-artifacts.js +53 -0
- package/dist/opencode/build/src/cli/workflow.js +5 -1
- package/dist/opencode/build/src/flow-kit/provision.d.ts +23 -0
- package/dist/opencode/build/src/flow-kit/provision.js +99 -0
- package/dist/opencode/build/src/flow-kit/validate.d.ts +52 -0
- package/dist/opencode/build/src/flow-kit/validate.js +214 -9
- package/dist/opencode/build/src/runtime-adapters.js +1 -1
- package/dist/opencode/context/contracts/execution-contract.md +30 -1
- package/dist/opencode/context/contracts/review-contract.md +4 -0
- package/dist/opencode/context/contracts/trigger-guards.md +73 -0
- package/dist/opencode/context/settings/backlog-provider-settings.json +1 -1
- package/dist/opencode/context/settings/workspace-backlog-provider-settings.example.json +1 -1
- package/dist/opencode/docs/adr/0023-kit-provisioning.md +47 -0
- package/dist/opencode/docs/adr/index.md +1 -0
- package/dist/opencode/docs/architecture-engine-and-kits.md +17 -0
- package/dist/opencode/docs/context-map.md +3 -0
- package/dist/opencode/docs/decisions/backlog-readiness-source.md +89 -0
- package/dist/opencode/docs/decisions/index.md +1 -0
- package/dist/opencode/docs/developer-architecture.md +3 -3
- package/dist/opencode/docs/flow-kit-repository-contract.md +34 -3
- package/dist/opencode/docs/kit-authoring-guide.md +1 -1
- package/dist/opencode/docs/veritas-integration.md +12 -0
- package/dist/opencode/evals/ci/run-baseline.sh +4 -0
- package/dist/opencode/evals/integration/test_kit_provisioning.sh +112 -0
- package/dist/opencode/evals/integration/test_pull_work_provider.sh +18 -0
- package/dist/opencode/evals/integration/test_veritas_governance_kit.sh +256 -0
- package/dist/opencode/evals/integration/test_workflow_artifacts.sh +257 -0
- package/dist/opencode/evals/static/test_package.sh +6 -0
- package/dist/opencode/evals/static/test_workflow_skills.sh +16 -0
- package/dist/opencode/install.sh +1 -1
- package/dist/opencode/kits/builder/flows/publish-learn.flow.json +9 -1
- package/dist/opencode/kits/builder/skills/execute-plan/SKILL.md +4 -3
- package/dist/opencode/kits/builder/skills/pull-work/SKILL.md +12 -0
- package/dist/opencode/kits/builder/skills/review-work/SKILL.md +11 -0
- package/dist/opencode/kits/veritas-governance/adapter/readiness-to-trust-bundle.mjs +19 -20
- package/dist/opencode/kits/veritas-governance/assets/starter-hooks/githooks/post-commit +13 -0
- package/dist/opencode/kits/veritas-governance/assets/starter-hooks/githooks/pre-push +13 -0
- package/dist/opencode/kits/veritas-governance/assets/starter-standards/veritas/GOVERNANCE.md +23 -0
- package/dist/opencode/kits/veritas-governance/assets/starter-standards/veritas/README.md +58 -0
- package/dist/opencode/kits/veritas-governance/assets/starter-standards/veritas/authority/default.authority-settings.json +30 -0
- package/dist/opencode/kits/veritas-governance/assets/starter-standards/veritas/repo-map.json +115 -0
- package/dist/opencode/kits/veritas-governance/assets/starter-standards/veritas/repo-standards/default.repo-standards.json +54 -0
- package/dist/opencode/kits/veritas-governance/assets/starter-standards/veritas.claims.json +179 -0
- package/dist/opencode/kits/veritas-governance/docs/README.md +141 -10
- package/dist/opencode/kits/veritas-governance/fixtures/standards-authoring/approved.trust-bundle.json +74 -0
- package/dist/opencode/kits/veritas-governance/fixtures/standards-authoring/not-approved.trust-bundle.json +74 -0
- package/dist/opencode/kits/veritas-governance/flows/standards-authoring.flow.json +35 -0
- package/dist/opencode/kits/veritas-governance/kit.json +65 -0
- package/dist/opencode/kits/veritas-governance/skills/consult-standards/SKILL.md +73 -0
- package/dist/opencode/kits/veritas-governance/skills/standards-authoring/SKILL.md +87 -0
- package/dist/opencode/schemas/backlog-provider-settings.schema.json +1 -1
- package/dist/opencode/schemas/workflow-waves.schema.json +347 -0
- package/dist/opencode/scripts/check-layer-boundary.mjs +98 -0
- package/dist/pi/.pi/skills/consult-standards/SKILL.md +73 -0
- package/dist/pi/.pi/skills/execute-plan/SKILL.md +4 -3
- package/dist/pi/.pi/skills/pull-work/SKILL.md +12 -0
- package/dist/pi/.pi/skills/review-work/SKILL.md +11 -0
- package/dist/pi/.pi/skills/standards-authoring/SKILL.md +87 -0
- package/dist/pi/build/package.json +1 -1
- package/dist/pi/build/src/cli/init.js +35 -3
- package/dist/pi/build/src/cli/kit.js +95 -2
- package/dist/pi/build/src/cli/pull-work-provider.js +7 -1
- package/dist/pi/build/src/cli/validate-workflow-artifacts.js +53 -0
- package/dist/pi/build/src/cli/workflow.js +5 -1
- package/dist/pi/build/src/flow-kit/provision.d.ts +23 -0
- package/dist/pi/build/src/flow-kit/provision.js +99 -0
- package/dist/pi/build/src/flow-kit/validate.d.ts +52 -0
- package/dist/pi/build/src/flow-kit/validate.js +214 -9
- package/dist/pi/build/src/runtime-adapters.js +1 -1
- package/dist/pi/context/contracts/execution-contract.md +30 -1
- package/dist/pi/context/contracts/review-contract.md +4 -0
- package/dist/pi/context/contracts/trigger-guards.md +73 -0
- package/dist/pi/context/settings/backlog-provider-settings.json +1 -1
- package/dist/pi/context/settings/workspace-backlog-provider-settings.example.json +1 -1
- package/dist/pi/docs/adr/0023-kit-provisioning.md +47 -0
- package/dist/pi/docs/adr/index.md +1 -0
- package/dist/pi/docs/architecture-engine-and-kits.md +17 -0
- package/dist/pi/docs/context-map.md +3 -0
- package/dist/pi/docs/decisions/backlog-readiness-source.md +89 -0
- package/dist/pi/docs/decisions/index.md +1 -0
- package/dist/pi/docs/developer-architecture.md +3 -3
- package/dist/pi/docs/flow-kit-repository-contract.md +34 -3
- package/dist/pi/docs/kit-authoring-guide.md +1 -1
- package/dist/pi/docs/veritas-integration.md +12 -0
- package/dist/pi/evals/ci/run-baseline.sh +4 -0
- package/dist/pi/evals/integration/test_kit_provisioning.sh +112 -0
- package/dist/pi/evals/integration/test_pull_work_provider.sh +18 -0
- package/dist/pi/evals/integration/test_veritas_governance_kit.sh +256 -0
- package/dist/pi/evals/integration/test_workflow_artifacts.sh +257 -0
- package/dist/pi/evals/static/test_package.sh +6 -0
- package/dist/pi/evals/static/test_workflow_skills.sh +16 -0
- package/dist/pi/install.sh +1 -1
- package/dist/pi/kits/builder/flows/publish-learn.flow.json +9 -1
- package/dist/pi/kits/builder/skills/execute-plan/SKILL.md +4 -3
- package/dist/pi/kits/builder/skills/pull-work/SKILL.md +12 -0
- package/dist/pi/kits/builder/skills/review-work/SKILL.md +11 -0
- package/dist/pi/kits/veritas-governance/adapter/readiness-to-trust-bundle.mjs +19 -20
- package/dist/pi/kits/veritas-governance/assets/starter-hooks/githooks/post-commit +13 -0
- package/dist/pi/kits/veritas-governance/assets/starter-hooks/githooks/pre-push +13 -0
- package/dist/pi/kits/veritas-governance/assets/starter-standards/veritas/GOVERNANCE.md +23 -0
- package/dist/pi/kits/veritas-governance/assets/starter-standards/veritas/README.md +58 -0
- package/dist/pi/kits/veritas-governance/assets/starter-standards/veritas/authority/default.authority-settings.json +30 -0
- package/dist/pi/kits/veritas-governance/assets/starter-standards/veritas/repo-map.json +115 -0
- package/dist/pi/kits/veritas-governance/assets/starter-standards/veritas/repo-standards/default.repo-standards.json +54 -0
- package/dist/pi/kits/veritas-governance/assets/starter-standards/veritas.claims.json +179 -0
- package/dist/pi/kits/veritas-governance/docs/README.md +141 -10
- package/dist/pi/kits/veritas-governance/fixtures/standards-authoring/approved.trust-bundle.json +74 -0
- package/dist/pi/kits/veritas-governance/fixtures/standards-authoring/not-approved.trust-bundle.json +74 -0
- package/dist/pi/kits/veritas-governance/flows/standards-authoring.flow.json +35 -0
- package/dist/pi/kits/veritas-governance/kit.json +65 -0
- package/dist/pi/kits/veritas-governance/skills/consult-standards/SKILL.md +73 -0
- package/dist/pi/kits/veritas-governance/skills/standards-authoring/SKILL.md +87 -0
- package/dist/pi/schemas/backlog-provider-settings.schema.json +1 -1
- package/dist/pi/schemas/workflow-waves.schema.json +347 -0
- package/dist/pi/scripts/check-layer-boundary.mjs +98 -0
- package/docs/adr/0023-kit-provisioning.md +47 -0
- package/docs/adr/index.md +1 -0
- package/docs/architecture-engine-and-kits.md +17 -0
- package/docs/context-map.md +3 -0
- package/docs/decisions/backlog-readiness-source.md +89 -0
- package/docs/decisions/index.md +1 -0
- package/docs/developer-architecture.md +3 -3
- package/docs/flow-kit-repository-contract.md +34 -3
- package/docs/kit-authoring-guide.md +1 -1
- package/docs/veritas-integration.md +12 -0
- package/evals/ci/run-baseline.sh +4 -0
- package/evals/integration/test_kit_provisioning.sh +112 -0
- package/evals/integration/test_pull_work_provider.sh +18 -0
- package/evals/integration/test_veritas_governance_kit.sh +256 -0
- package/evals/integration/test_workflow_artifacts.sh +257 -0
- package/evals/static/test_package.sh +6 -0
- package/evals/static/test_workflow_skills.sh +16 -0
- package/kits/builder/flows/publish-learn.flow.json +9 -1
- package/kits/builder/skills/execute-plan/SKILL.md +4 -3
- package/kits/builder/skills/pull-work/SKILL.md +12 -0
- package/kits/builder/skills/review-work/SKILL.md +11 -0
- package/kits/veritas-governance/adapter/readiness-to-trust-bundle.mjs +19 -20
- package/kits/veritas-governance/assets/starter-hooks/githooks/post-commit +13 -0
- package/kits/veritas-governance/assets/starter-hooks/githooks/pre-push +13 -0
- package/kits/veritas-governance/assets/starter-standards/veritas/GOVERNANCE.md +23 -0
- package/kits/veritas-governance/assets/starter-standards/veritas/README.md +58 -0
- package/kits/veritas-governance/assets/starter-standards/veritas/authority/default.authority-settings.json +30 -0
- package/kits/veritas-governance/assets/starter-standards/veritas/repo-map.json +115 -0
- package/kits/veritas-governance/assets/starter-standards/veritas/repo-standards/default.repo-standards.json +54 -0
- package/kits/veritas-governance/assets/starter-standards/veritas.claims.json +179 -0
- package/kits/veritas-governance/docs/README.md +141 -10
- package/kits/veritas-governance/fixtures/standards-authoring/approved.trust-bundle.json +74 -0
- package/kits/veritas-governance/fixtures/standards-authoring/not-approved.trust-bundle.json +74 -0
- package/kits/veritas-governance/flows/standards-authoring.flow.json +35 -0
- package/kits/veritas-governance/kit.json +65 -0
- package/kits/veritas-governance/skills/consult-standards/SKILL.md +73 -0
- package/kits/veritas-governance/skills/standards-authoring/SKILL.md +87 -0
- package/package.json +2 -1
- package/schemas/backlog-provider-settings.schema.json +1 -1
- package/schemas/workflow-waves.schema.json +347 -0
- package/scripts/check-layer-boundary.mjs +98 -0
- package/src/cli/builder-flow-runtime.test.mjs +86 -0
- package/src/cli/flow-resolver-composition.test.mjs +20 -1
- package/src/cli/init.ts +31 -3
- package/src/cli/kit-metadata-security.test.mjs +163 -1
- package/src/cli/kit-provisioning.test.mjs +122 -0
- package/src/cli/kit.ts +83 -2
- package/src/cli/pull-work-provider.ts +7 -1
- package/src/cli/validate-waves.test.mjs +134 -0
- package/src/cli/validate-workflow-artifacts.ts +47 -0
- package/src/cli/workflow.ts +7 -1
- package/src/flow-kit/provision.ts +118 -0
- package/src/flow-kit/validate.ts +233 -10
- package/src/runtime-adapters.ts +1 -1
|
@@ -133,6 +133,72 @@ echo "--- exemption-issuance: gate blocks without a verified approval, passes wi
|
|
|
133
133
|
exemption_gate_case "$KIT/fixtures/exemption/approved.trust-bundle.json" "exemption-positive" 0
|
|
134
134
|
exemption_gate_case "$KIT/fixtures/exemption/not-approved.trust-bundle.json" "exemption-negative" 1
|
|
135
135
|
|
|
136
|
+
# --- standards-authoring flow (Slice 2 PR3): registration, gate shape, gate cases ---
|
|
137
|
+
# Agentless propose -> apply flow whose human-approval-gate blocks the `veritas init --apply`
|
|
138
|
+
# write until a human-authored standards-authoring-approval claim is verified. The kit only
|
|
139
|
+
# gates the sign-off; Veritas does the derivation and the write (no evaluation reimplemented).
|
|
140
|
+
AUTHORING_FLOWDEF="$KIT/flows/standards-authoring.flow.json"
|
|
141
|
+
if node -e "const f=require('$AUTHORING_FLOWDEF'); if(f.id!=='veritas-governance.standards-authoring') process.exit(1);" 2>/dev/null; then
|
|
142
|
+
pass "standards-authoring flow file has id veritas-governance.standards-authoring"
|
|
143
|
+
else
|
|
144
|
+
fail "standards-authoring flow file missing or has unexpected id"
|
|
145
|
+
fi
|
|
146
|
+
if rg -q '"id": *"veritas-governance\.standards-authoring"' "$KIT/kit.json" && rg -q '"path": *"flows/standards-authoring\.flow\.json"' "$KIT/kit.json"; then
|
|
147
|
+
pass "standards-authoring flow is registered in kit.json flows[]"
|
|
148
|
+
else
|
|
149
|
+
fail "standards-authoring flow is NOT registered in kit.json flows[]"
|
|
150
|
+
fi
|
|
151
|
+
if rg -q '"id": *"veritas-governance\.standards-authoring"' "$KIT/kit.json" && rg -q '"path": *"skills/standards-authoring/SKILL.md"' "$KIT/kit.json"; then
|
|
152
|
+
pass "standards-authoring skill is registered in kit.json skills[]"
|
|
153
|
+
else
|
|
154
|
+
fail "standards-authoring skill is NOT registered in kit.json skills[]"
|
|
155
|
+
fi
|
|
156
|
+
# Agentless invariant: the kit declares no flow_step_actions (would opt into Builder's
|
|
157
|
+
# producer-ownership contract and break the agentless gate flows).
|
|
158
|
+
if rg -q 'flow_step_actions' "$KIT/kit.json"; then
|
|
159
|
+
fail "kit.json declares flow_step_actions — veritas-governance flows are agentless"
|
|
160
|
+
else
|
|
161
|
+
pass "kit stays agentless (no flow_step_actions)"
|
|
162
|
+
fi
|
|
163
|
+
if node -e "
|
|
164
|
+
const f=require('$AUTHORING_FLOWDEF');
|
|
165
|
+
const g=f.gates['human-approval-gate'];
|
|
166
|
+
const bc=g.expects[0].bundle_claim;
|
|
167
|
+
if (g.expects[0].kind!=='trust.bundle') process.exit(1);
|
|
168
|
+
if (bc.claimType!=='standards-authoring-approval') process.exit(1);
|
|
169
|
+
if (bc.subjectType!=='repo-governance-change') process.exit(1);
|
|
170
|
+
if (JSON.stringify(bc.accepted_statuses)!=='[\"verified\"]') process.exit(1);
|
|
171
|
+
" 2>/dev/null; then
|
|
172
|
+
pass "standards-authoring gate expects[] kind is trust.bundle and pins claimType/subjectType/accepted_statuses exactly"
|
|
173
|
+
else
|
|
174
|
+
fail "standards-authoring gate expects[] shape does not match the pinned claim selector"
|
|
175
|
+
fi
|
|
176
|
+
# Positive/negative gate cases against the committed fixtures. $1 bundle, $2 label, $3 expect.
|
|
177
|
+
authoring_gate_case() {
|
|
178
|
+
local bundle="$1" label="$2" expect="$3"
|
|
179
|
+
local work="$TMP_DIR/$label"; mkdir -p "$work"; ( cd "$work" && node "$FLOW_CLI" init >/dev/null 2>&1 )
|
|
180
|
+
( cd "$work" && node "$FLOW_CLI" start "$AUTHORING_FLOWDEF" --run-id "$label" >/dev/null 2>&1 )
|
|
181
|
+
( cd "$work" && node "$FLOW_CLI" attach-evidence "$label" --gate human-approval-gate --file "$bundle" --bundle >"$work/attach.out" 2>&1 )
|
|
182
|
+
if ! rg -q 'kind: trust.bundle' "$work/attach.out"; then
|
|
183
|
+
fail "[$label] evidence did not attach as kind: trust.bundle"; sed -n '1,20p' "$work/attach.out"; return
|
|
184
|
+
fi
|
|
185
|
+
( cd "$work" && node "$FLOW_CLI" evaluate "$label" --gate human-approval-gate --exit-code >"$work/eval.out" 2>&1 )
|
|
186
|
+
local got=$?
|
|
187
|
+
if [[ "$got" == "$expect" ]]; then
|
|
188
|
+
pass "[$label] standards-authoring gate evaluate exit $got as expected"
|
|
189
|
+
else
|
|
190
|
+
fail "[$label] standards-authoring gate evaluate exit $got, expected $expect"; sed -n '1,20p' "$work/eval.out"
|
|
191
|
+
fi
|
|
192
|
+
}
|
|
193
|
+
authoring_gate_case "$KIT/fixtures/standards-authoring/approved.trust-bundle.json" "authoring-positive" 0
|
|
194
|
+
authoring_gate_case "$KIT/fixtures/standards-authoring/not-approved.trust-bundle.json" "authoring-negative" 1
|
|
195
|
+
# No-fork: the authoring skill wraps the veritas CLI; it must not vendor rule/claim evaluation.
|
|
196
|
+
if rg -q -i 'evaluateRepoStandards|evidence-check-runner\.mjs|class +[A-Za-z]*RuleEngine|repo-standards/default\.repo-standards\.json' "$KIT/skills/standards-authoring" "$KIT/flows/standards-authoring.flow.json" 2>/dev/null; then
|
|
197
|
+
fail "standards-authoring skill/flow appears to vendor Veritas evaluation logic (no-fork violated)"
|
|
198
|
+
else
|
|
199
|
+
pass "no-fork: standards-authoring wraps the veritas CLI, no vendored rule/claim engine"
|
|
200
|
+
fi
|
|
201
|
+
|
|
136
202
|
# --- exemption-issuance: issue-step DECLARED append semantics (AC4) --------------
|
|
137
203
|
# Seed a scratch delivery/DECLARED with main's real 2-entry array (inlined here, not read
|
|
138
204
|
# live from the repo, so this eval is not coupled to that file's future contents), then
|
|
@@ -364,6 +430,196 @@ else
|
|
|
364
430
|
echo " - SKIP live Veritas leg (set VERITAS_BIN + VERITAS_GOVERNED_REPO to enable); fixtures are captured real output"
|
|
365
431
|
fi
|
|
366
432
|
|
|
433
|
+
# --- Starter-standards provisioning (Slice 2 PR2): the kit scaffolds a runnable .veritas/ ---
|
|
434
|
+
# The kit declares its starter Repo Standards as provisions[]; `kit provision` copies them into
|
|
435
|
+
# a consumer repo. This asserts the scaffold lands and is well-formed; when a Veritas binary is
|
|
436
|
+
# available it further asserts `veritas readiness` runs end-to-end against the scaffolded repo.
|
|
437
|
+
echo "--- starter-standards provisioning ---"
|
|
438
|
+
FA_CLI="$ROOT/build/src/cli.js"
|
|
439
|
+
if [[ ! -f "$FA_CLI" ]]; then
|
|
440
|
+
fail "flow-agents CLI not built at build/src/cli.js (run npm run build)"
|
|
441
|
+
else
|
|
442
|
+
prov="$TMP_DIR/provisioned-repo"; mkdir -p "$prov"
|
|
443
|
+
if node "$FA_CLI" kit provision "$KIT" --target "$prov" >"$TMP_DIR/provision.out" 2>&1; then
|
|
444
|
+
pass "kit provision scaffolds starter standards into a consumer repo"
|
|
445
|
+
else
|
|
446
|
+
fail "kit provision failed"; sed -n '1,20p' "$TMP_DIR/provision.out"
|
|
447
|
+
fi
|
|
448
|
+
# Every declared provision target must land and (for JSON) parse.
|
|
449
|
+
starter_targets=(
|
|
450
|
+
".veritas/repo-map.json"
|
|
451
|
+
".veritas/repo-standards/default.repo-standards.json"
|
|
452
|
+
".veritas/authority/default.authority-settings.json"
|
|
453
|
+
".veritas/GOVERNANCE.md"
|
|
454
|
+
".veritas/README.md"
|
|
455
|
+
"veritas.claims.json"
|
|
456
|
+
)
|
|
457
|
+
for rel in "${starter_targets[@]}"; do
|
|
458
|
+
if [[ -f "$prov/$rel" ]]; then
|
|
459
|
+
if [[ "$rel" == *.json ]]; then
|
|
460
|
+
if node -e "JSON.parse(require('fs').readFileSync(process.argv[1],'utf8'))" "$prov/$rel" >/dev/null 2>&1; then
|
|
461
|
+
pass "scaffolded $rel is present and valid JSON"
|
|
462
|
+
else
|
|
463
|
+
fail "scaffolded $rel is not valid JSON"
|
|
464
|
+
fi
|
|
465
|
+
else
|
|
466
|
+
pass "scaffolded $rel is present"
|
|
467
|
+
fi
|
|
468
|
+
else
|
|
469
|
+
fail "expected scaffolded file missing: $rel"
|
|
470
|
+
fi
|
|
471
|
+
done
|
|
472
|
+
# The scaffold must reference the Veritas engine's OWN starter output, not reimplement it:
|
|
473
|
+
# every provision source lives under assets/, never in adapter/ or flows/ (no-fork already
|
|
474
|
+
# scopes there). Assert the declared sources exist inside the kit's assets tree.
|
|
475
|
+
if node -e "
|
|
476
|
+
const fs=require('fs'),path=require('path');
|
|
477
|
+
const kit=JSON.parse(fs.readFileSync(process.argv[1]+'/kit.json','utf8'));
|
|
478
|
+
const bad=(kit.provisions||[]).filter(p=>!p.path.startsWith('assets/')||!fs.existsSync(path.join(process.argv[1],p.path)));
|
|
479
|
+
if(bad.length){console.error('bad provisions:',bad.map(p=>p.id).join(','));process.exit(1)}
|
|
480
|
+
" "$KIT" >/dev/null 2>&1; then
|
|
481
|
+
pass "all starter provisions source from the kit's assets/ tree"
|
|
482
|
+
else
|
|
483
|
+
fail "a starter provision points outside assets/ or at a missing file"
|
|
484
|
+
fi
|
|
485
|
+
# Live: a Veritas binary must be able to run readiness against the scaffolded repo.
|
|
486
|
+
VBIN2="${VERITAS_BIN:-veritas}"
|
|
487
|
+
if command -v "$VBIN2" >/dev/null 2>&1 || [[ -x "$VBIN2" ]]; then
|
|
488
|
+
( cd "$prov" && git init -q && printf '{"name":"scaffold-eval","scripts":{"test":"node -e \"process.exit(0)\""}}\n' > package.json \
|
|
489
|
+
&& git add -A && git -c user.email=eval@local -c user.name=eval commit -qm scaffold ) >/dev/null 2>&1
|
|
490
|
+
if ( cd "$prov" && "$VBIN2" readiness --working-tree >/dev/null 2>&1 ); then :; fi
|
|
491
|
+
if ls "$prov/.kontourai/veritas/evidence/"*.json >/dev/null 2>&1; then
|
|
492
|
+
pass "veritas readiness runs end-to-end on the kit-scaffolded repo (evidence report produced)"
|
|
493
|
+
else
|
|
494
|
+
fail "veritas readiness produced no evidence report on the scaffolded repo"
|
|
495
|
+
fi
|
|
496
|
+
else
|
|
497
|
+
echo " - SKIP scaffold readiness leg (no Veritas binary; set VERITAS_BIN to enable)"
|
|
498
|
+
fi
|
|
499
|
+
fi
|
|
500
|
+
|
|
501
|
+
# --- Governance git-hook provisioning (Slice 3 PR / #648) --------------------------
|
|
502
|
+
# The kit ships the two governance git hooks as provisions[]; `kit provision` lands them
|
|
503
|
+
# (non-executable), and a documented chmod + core.hooksPath step activates them. This asserts
|
|
504
|
+
# the hook files land with the expected bodies and that, once activated, the pre-push hook fires.
|
|
505
|
+
echo "--- governance git-hook provisioning ---"
|
|
506
|
+
FA_CLI2="$ROOT/build/src/cli.js"
|
|
507
|
+
if [[ ! -f "$FA_CLI2" ]]; then
|
|
508
|
+
fail "flow-agents CLI not built at build/src/cli.js (run npm run build)"
|
|
509
|
+
else
|
|
510
|
+
hookrepo="$TMP_DIR/hook-provisioned-repo"; mkdir -p "$hookrepo"
|
|
511
|
+
( cd "$hookrepo" && git init -q && printf '{"name":"hook-eval","scripts":{"prepush":"echo PREPUSH-RAN"}}\n' > package.json )
|
|
512
|
+
if node "$FA_CLI2" kit provision "$KIT" --target "$hookrepo" >"$TMP_DIR/hookprov.out" 2>&1; then
|
|
513
|
+
pass "kit provision lands the governance git hooks"
|
|
514
|
+
else
|
|
515
|
+
fail "kit provision (hooks) failed"; sed -n '1,20p' "$TMP_DIR/hookprov.out"
|
|
516
|
+
fi
|
|
517
|
+
# Both hook files present, match the committed kit assets byte-for-byte, AND carry their
|
|
518
|
+
# defining command. The byte-match alone cannot catch a corrupted kit asset (a bad asset is
|
|
519
|
+
# copied verbatim and still matches itself), so a content assertion pins what each hook must do.
|
|
520
|
+
declare -A hook_must_contain=(
|
|
521
|
+
[pre-push]='npm run --if-present prepush'
|
|
522
|
+
[post-commit]='veritas readiness --changed-from HEAD~1 --changed-to HEAD'
|
|
523
|
+
)
|
|
524
|
+
for hook in pre-push post-commit; do
|
|
525
|
+
if [[ -f "$hookrepo/.githooks/$hook" ]]; then
|
|
526
|
+
if cmp -s "$hookrepo/.githooks/$hook" "$KIT/assets/starter-hooks/githooks/$hook"; then
|
|
527
|
+
pass "scaffolded .githooks/$hook matches the kit asset byte-for-byte"
|
|
528
|
+
else
|
|
529
|
+
fail "scaffolded .githooks/$hook differs from the kit asset"
|
|
530
|
+
fi
|
|
531
|
+
if grep -qF "${hook_must_contain[$hook]}" "$hookrepo/.githooks/$hook"; then
|
|
532
|
+
pass "scaffolded .githooks/$hook invokes its defining command (${hook_must_contain[$hook]})"
|
|
533
|
+
else
|
|
534
|
+
fail "scaffolded .githooks/$hook is missing its defining command (${hook_must_contain[$hook]}) — corrupted asset?"
|
|
535
|
+
fi
|
|
536
|
+
else
|
|
537
|
+
fail "expected git hook missing: .githooks/$hook"
|
|
538
|
+
fi
|
|
539
|
+
done
|
|
540
|
+
# Provisions land non-executable by design (the engine copy is agent-blind) — assert for BOTH.
|
|
541
|
+
for hook in pre-push post-commit; do
|
|
542
|
+
if [[ -x "$hookrepo/.githooks/$hook" ]]; then
|
|
543
|
+
fail "provisioned .githooks/$hook is already executable — provisioning should be agent-blind (no +x)"
|
|
544
|
+
else
|
|
545
|
+
pass "provisioned .githooks/$hook lands non-executable (agent-blind copy; activation is explicit)"
|
|
546
|
+
fi
|
|
547
|
+
done
|
|
548
|
+
( cd "$hookrepo" && chmod +x .githooks/pre-push .githooks/post-commit && git config core.hooksPath .githooks )
|
|
549
|
+
if [[ "$(cd "$hookrepo" && git config --get core.hooksPath)" == ".githooks" ]]; then
|
|
550
|
+
pass "activation sets core.hooksPath to .githooks"
|
|
551
|
+
else
|
|
552
|
+
fail "activation did not set core.hooksPath"
|
|
553
|
+
fi
|
|
554
|
+
# Prove GIT actually dispatches the hook via core.hooksPath — not just direct invocation. Push
|
|
555
|
+
# to a local bare remote; the pre-push hook (runs `npm run --if-present prepush`) fires through
|
|
556
|
+
# git's own hook machinery. Output captured to a file so pipefail + git's SIGPIPE can't interfere.
|
|
557
|
+
( cd "$hookrepo" && git -c user.email=eval@local -c user.name=eval commit -qm base --allow-empty ) >/dev/null 2>&1
|
|
558
|
+
bare="$TMP_DIR/hook-remote.git"; git init --bare -q "$bare"
|
|
559
|
+
( cd "$hookrepo" && git remote add origin "$bare" && git push -q origin HEAD:refs/heads/main ) >"$TMP_DIR/gitpush.out" 2>&1
|
|
560
|
+
if grep -qF PREPUSH-RAN "$TMP_DIR/gitpush.out"; then
|
|
561
|
+
pass "git dispatches the pre-push hook via core.hooksPath (real git push fires it)"
|
|
562
|
+
else
|
|
563
|
+
fail "git push did not fire the pre-push hook via core.hooksPath"; sed -n '1,12p' "$TMP_DIR/gitpush.out"
|
|
564
|
+
fi
|
|
565
|
+
# No-fork: hook assets live under assets/, and invoke the veritas CLI — they must not vendor
|
|
566
|
+
# rule/claim evaluation. (assets/ is outside the adapter/flows no-fork scope; assert explicitly.)
|
|
567
|
+
if rg -q -i 'evaluateRepoStandards|evidence-check-runner\.mjs|class +[A-Za-z]*RuleEngine' "$KIT/assets/starter-hooks" 2>/dev/null; then
|
|
568
|
+
fail "governance hook assets appear to vendor Veritas evaluation logic (no-fork violated)"
|
|
569
|
+
else
|
|
570
|
+
pass "no-fork: governance hooks invoke the veritas CLI only (no vendored rule/claim engine)"
|
|
571
|
+
fi
|
|
572
|
+
fi
|
|
573
|
+
|
|
574
|
+
# --- consult-standards skill (Slice 4 / #649): JIT guidance via `veritas explain` ---------
|
|
575
|
+
# A pull-based advisory skill telling an agent to run `veritas explain --file <path>` before
|
|
576
|
+
# editing. No MCP server; wraps the veritas CLI, reimplements no evaluation.
|
|
577
|
+
echo "--- consult-standards skill ---"
|
|
578
|
+
CONSULT_SKILL="$KIT/skills/consult-standards/SKILL.md"
|
|
579
|
+
if [[ -f "$CONSULT_SKILL" ]]; then
|
|
580
|
+
pass "consult-standards SKILL.md is present"
|
|
581
|
+
else
|
|
582
|
+
fail "consult-standards SKILL.md is missing"
|
|
583
|
+
fi
|
|
584
|
+
if rg -q '"id": *"veritas-governance\.consult-standards"' "$KIT/kit.json" && rg -q '"path": *"skills/consult-standards/SKILL.md"' "$KIT/kit.json"; then
|
|
585
|
+
pass "consult-standards skill is registered in kit.json skills[]"
|
|
586
|
+
else
|
|
587
|
+
fail "consult-standards skill is NOT registered in kit.json skills[]"
|
|
588
|
+
fi
|
|
589
|
+
# It must point agents at `veritas explain` (the JIT producer), not vendor evaluation.
|
|
590
|
+
if grep -qF 'veritas explain' "$CONSULT_SKILL"; then
|
|
591
|
+
pass "consult-standards points at the veritas explain CLI"
|
|
592
|
+
else
|
|
593
|
+
fail "consult-standards does not reference veritas explain"
|
|
594
|
+
fi
|
|
595
|
+
if rg -q -i 'evaluateRepoStandards|evidence-check-runner\.mjs|class +[A-Za-z]*RuleEngine' "$KIT/skills/consult-standards" 2>/dev/null; then
|
|
596
|
+
fail "consult-standards appears to vendor Veritas evaluation logic (no-fork violated)"
|
|
597
|
+
else
|
|
598
|
+
pass "no-fork: consult-standards wraps the veritas CLI, no vendored rule/claim engine"
|
|
599
|
+
fi
|
|
600
|
+
# No-MCP invariant (#649 / ADR 0011): the kit ships no MCP server CODE and declares no MCP
|
|
601
|
+
# dependency. Scoped to non-markdown files so the docs' explicit "no MCP server" prose (which
|
|
602
|
+
# names the concept precisely to say the kit avoids it) does not trip the check.
|
|
603
|
+
if rg -q -i 'modelcontextprotocol|new +McpServer|StdioServerTransport|createMcpServer' "$KIT" --glob '!*.md' 2>/dev/null; then
|
|
604
|
+
fail "kit ships MCP server code/dependency — #649 guidance is a skill, not an MCP server (ADR 0011)"
|
|
605
|
+
else
|
|
606
|
+
pass "no MCP server: JIT guidance is an agent-pull skill (ADR 0011)"
|
|
607
|
+
fi
|
|
608
|
+
# Live leg: with a Veritas binary, a scaffolded repo's `veritas explain --file` produces JIT context.
|
|
609
|
+
VBIN3="${VERITAS_BIN:-veritas}"
|
|
610
|
+
if command -v "$VBIN3" >/dev/null 2>&1 || [[ -x "$VBIN3" ]]; then
|
|
611
|
+
cs="$TMP_DIR/consult-repo"; mkdir -p "$cs"
|
|
612
|
+
( cd "$cs" && git init -q && printf '{"name":"consult-eval","scripts":{"test":"node -e \\"process.exit(0)\\""}}\n' > package.json && "$VBIN3" init >/dev/null 2>&1 )
|
|
613
|
+
explain_out="$( cd "$cs" && "$VBIN3" explain --file package.json 2>&1 )"
|
|
614
|
+
if printf '%s' "$explain_out" | grep -qF 'Veritas JIT Context'; then
|
|
615
|
+
pass "veritas explain --file produces JIT context on a governed repo (the guidance the skill invokes)"
|
|
616
|
+
else
|
|
617
|
+
fail "veritas explain --file did not produce JIT context"; printf '%s\n' "$explain_out" | sed -n '1,8p'
|
|
618
|
+
fi
|
|
619
|
+
else
|
|
620
|
+
echo " - SKIP consult-standards live leg (no Veritas binary; set VERITAS_BIN to enable)"
|
|
621
|
+
fi
|
|
622
|
+
|
|
367
623
|
echo ""
|
|
368
624
|
if [[ "$errors" -eq 0 ]]; then
|
|
369
625
|
echo "PASS: veritas-governance kit gate demo (positive passes, negative blocks)"
|
|
@@ -1271,6 +1271,263 @@ else
|
|
|
1271
1271
|
_fail "extra criteria failure did not mention criteria mismatch"
|
|
1272
1272
|
fi
|
|
1273
1273
|
|
|
1274
|
+
# --- waves.json (#663 slice 1): wave manifest + reconcile-against-manifest as data ---------
|
|
1275
|
+
# The manifest is additive: every earlier fixture directory in this file has no waves.json and
|
|
1276
|
+
# still validates — that is the "absent file changes nothing" half of AC1.
|
|
1277
|
+
|
|
1278
|
+
GOOD_WAVES="$TMPDIR_EVAL/good-waves"
|
|
1279
|
+
mkdir -p "$GOOD_WAVES"
|
|
1280
|
+
cat > "$GOOD_WAVES/waves.json" <<'JSON'
|
|
1281
|
+
{
|
|
1282
|
+
"schema_version": "1.0",
|
|
1283
|
+
"task_slug": "good-waves",
|
|
1284
|
+
"waves": [
|
|
1285
|
+
{
|
|
1286
|
+
"wave_id": "execute-wave-1",
|
|
1287
|
+
"step": "execute",
|
|
1288
|
+
"declared_at": "2026-07-16T00:00:00Z",
|
|
1289
|
+
"expected_workers": [
|
|
1290
|
+
{"worker_id": "worker-1", "task": "implement module a", "owned_files": ["src/a.ts"]},
|
|
1291
|
+
{"worker_id": "worker-2", "task": "implement module b"}
|
|
1292
|
+
],
|
|
1293
|
+
"worker_results": [
|
|
1294
|
+
{"worker_id": "worker-1", "status": "completed", "summary": "module a implemented", "recorded_at": "2026-07-16T01:00:00Z"},
|
|
1295
|
+
{"worker_id": "worker-2", "status": "failed", "summary": "module b tests failing", "recorded_at": "2026-07-16T01:00:00Z"}
|
|
1296
|
+
],
|
|
1297
|
+
"reconciliation": {
|
|
1298
|
+
"status": "complete",
|
|
1299
|
+
"expected_count": 2,
|
|
1300
|
+
"reported_count": 2,
|
|
1301
|
+
"summary": "2 of 2 reported; no workers not_reported",
|
|
1302
|
+
"reconciled_at": "2026-07-16T01:05:00Z"
|
|
1303
|
+
}
|
|
1304
|
+
}
|
|
1305
|
+
]
|
|
1306
|
+
}
|
|
1307
|
+
JSON
|
|
1308
|
+
|
|
1309
|
+
if flow_agents_node "$VALIDATOR" "$GOOD_WAVES" >"$TMPDIR_EVAL/good-waves.out" 2>&1; then
|
|
1310
|
+
_pass "fully reported wave manifest passes (2 of 2 reported)"
|
|
1311
|
+
else
|
|
1312
|
+
_fail "fully reported wave manifest should pass: $(cat "$TMPDIR_EVAL/good-waves.out")"
|
|
1313
|
+
fi
|
|
1314
|
+
|
|
1315
|
+
# Scenario (issue #663 AC): 3 workers expected, one never lands a terminal record. The
|
|
1316
|
+
# reconciled manifest records worker-3 explicitly as not_reported with "2 of 3 reported" —
|
|
1317
|
+
# and that is VALID DATA (exit 0), not a hook block: slice 1 makes the drop visible, slice 2
|
|
1318
|
+
# (stop-goal-fit) decides whether to refuse. Silent absorption is what must fail, below.
|
|
1319
|
+
SCENARIO_WAVES="$TMPDIR_EVAL/scenario-waves"
|
|
1320
|
+
mkdir -p "$SCENARIO_WAVES"
|
|
1321
|
+
cat > "$SCENARIO_WAVES/waves.json" <<'JSON'
|
|
1322
|
+
{
|
|
1323
|
+
"schema_version": "1.0",
|
|
1324
|
+
"task_slug": "scenario-waves",
|
|
1325
|
+
"waves": [
|
|
1326
|
+
{
|
|
1327
|
+
"wave_id": "execute-wave-1",
|
|
1328
|
+
"step": "execute",
|
|
1329
|
+
"declared_at": "2026-07-16T00:00:00Z",
|
|
1330
|
+
"expected_workers": [
|
|
1331
|
+
{"worker_id": "worker-1", "task": "task one"},
|
|
1332
|
+
{"worker_id": "worker-2", "task": "task two"},
|
|
1333
|
+
{"worker_id": "worker-3", "task": "task three"}
|
|
1334
|
+
],
|
|
1335
|
+
"worker_results": [
|
|
1336
|
+
{"worker_id": "worker-1", "status": "completed", "summary": "done", "recorded_at": "2026-07-16T01:00:00Z"},
|
|
1337
|
+
{"worker_id": "worker-2", "status": "completed", "summary": "done", "recorded_at": "2026-07-16T01:00:00Z"},
|
|
1338
|
+
{"worker_id": "worker-3", "status": "not_reported", "summary": "no terminal report received by wave close; routed to re-dispatch", "recorded_at": "2026-07-16T01:05:00Z"}
|
|
1339
|
+
],
|
|
1340
|
+
"reconciliation": {
|
|
1341
|
+
"status": "incomplete",
|
|
1342
|
+
"expected_count": 3,
|
|
1343
|
+
"reported_count": 2,
|
|
1344
|
+
"summary": "2 of 3 reported; worker-3 not_reported",
|
|
1345
|
+
"reconciled_at": "2026-07-16T01:05:00Z"
|
|
1346
|
+
}
|
|
1347
|
+
}
|
|
1348
|
+
]
|
|
1349
|
+
}
|
|
1350
|
+
JSON
|
|
1351
|
+
|
|
1352
|
+
if flow_agents_node "$VALIDATOR" "$SCENARIO_WAVES" >"$TMPDIR_EVAL/scenario-waves.out" 2>&1; then
|
|
1353
|
+
_pass "2-of-3 scenario with explicit not_reported worker validates as data (no silent drop, no block)"
|
|
1354
|
+
else
|
|
1355
|
+
_fail "2-of-3 not_reported scenario should validate as data: $(cat "$TMPDIR_EVAL/scenario-waves.out")"
|
|
1356
|
+
fi
|
|
1357
|
+
|
|
1358
|
+
# Silent drop: reconciliation claims complete 3-of-3 while worker-3 has NO terminal record.
|
|
1359
|
+
mkdir -p "$BAD/waves-silent-drop"
|
|
1360
|
+
cat > "$BAD/waves-silent-drop/waves.json" <<'JSON'
|
|
1361
|
+
{
|
|
1362
|
+
"schema_version": "1.0",
|
|
1363
|
+
"task_slug": "waves-silent-drop",
|
|
1364
|
+
"waves": [
|
|
1365
|
+
{
|
|
1366
|
+
"wave_id": "execute-wave-1",
|
|
1367
|
+
"step": "execute",
|
|
1368
|
+
"declared_at": "2026-07-16T00:00:00Z",
|
|
1369
|
+
"expected_workers": [
|
|
1370
|
+
{"worker_id": "worker-1", "task": "task one"},
|
|
1371
|
+
{"worker_id": "worker-2", "task": "task two"},
|
|
1372
|
+
{"worker_id": "worker-3", "task": "task three"}
|
|
1373
|
+
],
|
|
1374
|
+
"worker_results": [
|
|
1375
|
+
{"worker_id": "worker-1", "status": "completed", "summary": "done", "recorded_at": "2026-07-16T01:00:00Z"},
|
|
1376
|
+
{"worker_id": "worker-2", "status": "completed", "summary": "done", "recorded_at": "2026-07-16T01:00:00Z"}
|
|
1377
|
+
],
|
|
1378
|
+
"reconciliation": {
|
|
1379
|
+
"status": "complete",
|
|
1380
|
+
"expected_count": 3,
|
|
1381
|
+
"reported_count": 3,
|
|
1382
|
+
"summary": "3 of 3 reported",
|
|
1383
|
+
"reconciled_at": "2026-07-16T01:05:00Z"
|
|
1384
|
+
}
|
|
1385
|
+
}
|
|
1386
|
+
]
|
|
1387
|
+
}
|
|
1388
|
+
JSON
|
|
1389
|
+
|
|
1390
|
+
if flow_agents_node "$VALIDATOR" "$BAD/waves-silent-drop" >"$TMPDIR_EVAL/waves-silent-drop.out" 2>&1; then
|
|
1391
|
+
_fail "silently dropped worker behind a complete claim should fail"
|
|
1392
|
+
elif rg -q 'worker worker-3 has no terminal status record' "$TMPDIR_EVAL/waves-silent-drop.out" \
|
|
1393
|
+
&& rg -q 'reported_count is 3 but 2 of 3 expected workers' "$TMPDIR_EVAL/waves-silent-drop.out" \
|
|
1394
|
+
&& rg -q 'complete requires every expected worker' "$TMPDIR_EVAL/waves-silent-drop.out"; then
|
|
1395
|
+
_pass "silently dropped worker fails with missing-record, count, and impossible-complete messages"
|
|
1396
|
+
else
|
|
1397
|
+
_fail "silent-drop failure did not name the dropped worker and count mismatch: $(cat "$TMPDIR_EVAL/waves-silent-drop.out")"
|
|
1398
|
+
fi
|
|
1399
|
+
|
|
1400
|
+
# A complete claim over an explicitly not_reported worker is still impossible.
|
|
1401
|
+
mkdir -p "$BAD/waves-complete-not-reported"
|
|
1402
|
+
cat > "$BAD/waves-complete-not-reported/waves.json" <<'JSON'
|
|
1403
|
+
{
|
|
1404
|
+
"schema_version": "1.0",
|
|
1405
|
+
"task_slug": "waves-complete-not-reported",
|
|
1406
|
+
"waves": [
|
|
1407
|
+
{
|
|
1408
|
+
"wave_id": "execute-wave-1",
|
|
1409
|
+
"step": "execute",
|
|
1410
|
+
"declared_at": "2026-07-16T00:00:00Z",
|
|
1411
|
+
"expected_workers": [
|
|
1412
|
+
{"worker_id": "worker-1", "task": "task one"},
|
|
1413
|
+
{"worker_id": "worker-2", "task": "task two"}
|
|
1414
|
+
],
|
|
1415
|
+
"worker_results": [
|
|
1416
|
+
{"worker_id": "worker-1", "status": "completed", "summary": "done", "recorded_at": "2026-07-16T01:00:00Z"},
|
|
1417
|
+
{"worker_id": "worker-2", "status": "not_reported", "summary": "never reported", "recorded_at": "2026-07-16T01:05:00Z"}
|
|
1418
|
+
],
|
|
1419
|
+
"reconciliation": {
|
|
1420
|
+
"status": "complete",
|
|
1421
|
+
"expected_count": 2,
|
|
1422
|
+
"reported_count": 1,
|
|
1423
|
+
"summary": "1 of 2 reported; worker-2 not_reported",
|
|
1424
|
+
"reconciled_at": "2026-07-16T01:05:00Z"
|
|
1425
|
+
}
|
|
1426
|
+
}
|
|
1427
|
+
]
|
|
1428
|
+
}
|
|
1429
|
+
JSON
|
|
1430
|
+
|
|
1431
|
+
if flow_agents_node "$VALIDATOR" "$BAD/waves-complete-not-reported" >"$TMPDIR_EVAL/waves-complete-not-reported.out" 2>&1; then
|
|
1432
|
+
_fail "complete claim over a not_reported worker should fail"
|
|
1433
|
+
elif rg -q 'complete requires every expected worker' "$TMPDIR_EVAL/waves-complete-not-reported.out"; then
|
|
1434
|
+
_pass "complete claim over a not_reported worker fails with actionable message"
|
|
1435
|
+
else
|
|
1436
|
+
_fail "complete-over-not_reported failure did not mention the complete rule: $(cat "$TMPDIR_EVAL/waves-complete-not-reported.out")"
|
|
1437
|
+
fi
|
|
1438
|
+
|
|
1439
|
+
# Exactly one terminal record per worker.
|
|
1440
|
+
mkdir -p "$BAD/waves-duplicate-record"
|
|
1441
|
+
cat > "$BAD/waves-duplicate-record/waves.json" <<'JSON'
|
|
1442
|
+
{
|
|
1443
|
+
"schema_version": "1.0",
|
|
1444
|
+
"task_slug": "waves-duplicate-record",
|
|
1445
|
+
"waves": [
|
|
1446
|
+
{
|
|
1447
|
+
"wave_id": "execute-wave-1",
|
|
1448
|
+
"step": "execute",
|
|
1449
|
+
"declared_at": "2026-07-16T00:00:00Z",
|
|
1450
|
+
"expected_workers": [
|
|
1451
|
+
{"worker_id": "worker-1", "task": "task one"}
|
|
1452
|
+
],
|
|
1453
|
+
"worker_results": [
|
|
1454
|
+
{"worker_id": "worker-1", "status": "completed", "summary": "done", "recorded_at": "2026-07-16T01:00:00Z"},
|
|
1455
|
+
{"worker_id": "worker-1", "status": "failed", "summary": "also failed?", "recorded_at": "2026-07-16T01:01:00Z"}
|
|
1456
|
+
]
|
|
1457
|
+
}
|
|
1458
|
+
]
|
|
1459
|
+
}
|
|
1460
|
+
JSON
|
|
1461
|
+
|
|
1462
|
+
if flow_agents_node "$VALIDATOR" "$BAD/waves-duplicate-record" >"$TMPDIR_EVAL/waves-duplicate-record.out" 2>&1; then
|
|
1463
|
+
_fail "duplicate terminal record should fail"
|
|
1464
|
+
elif rg -q 'more than one terminal status record for worker worker-1' "$TMPDIR_EVAL/waves-duplicate-record.out"; then
|
|
1465
|
+
_pass "duplicate terminal record fails with actionable message"
|
|
1466
|
+
else
|
|
1467
|
+
_fail "duplicate-record failure did not name the worker: $(cat "$TMPDIR_EVAL/waves-duplicate-record.out")"
|
|
1468
|
+
fi
|
|
1469
|
+
|
|
1470
|
+
# Every reporter must be declared in the manifest before dispatch.
|
|
1471
|
+
mkdir -p "$BAD/waves-undeclared-reporter"
|
|
1472
|
+
cat > "$BAD/waves-undeclared-reporter/waves.json" <<'JSON'
|
|
1473
|
+
{
|
|
1474
|
+
"schema_version": "1.0",
|
|
1475
|
+
"task_slug": "waves-undeclared-reporter",
|
|
1476
|
+
"waves": [
|
|
1477
|
+
{
|
|
1478
|
+
"wave_id": "execute-wave-1",
|
|
1479
|
+
"step": "execute",
|
|
1480
|
+
"declared_at": "2026-07-16T00:00:00Z",
|
|
1481
|
+
"expected_workers": [
|
|
1482
|
+
{"worker_id": "worker-1", "task": "task one"}
|
|
1483
|
+
],
|
|
1484
|
+
"worker_results": [
|
|
1485
|
+
{"worker_id": "worker-1", "status": "completed", "summary": "done", "recorded_at": "2026-07-16T01:00:00Z"},
|
|
1486
|
+
{"worker_id": "worker-9", "status": "completed", "summary": "surprise", "recorded_at": "2026-07-16T01:00:00Z"}
|
|
1487
|
+
]
|
|
1488
|
+
}
|
|
1489
|
+
]
|
|
1490
|
+
}
|
|
1491
|
+
JSON
|
|
1492
|
+
|
|
1493
|
+
if flow_agents_node "$VALIDATOR" "$BAD/waves-undeclared-reporter" >"$TMPDIR_EVAL/waves-undeclared-reporter.out" 2>&1; then
|
|
1494
|
+
_fail "undeclared reporter should fail"
|
|
1495
|
+
elif rg -q 'worker worker-9 that is not declared in expected_workers' "$TMPDIR_EVAL/waves-undeclared-reporter.out"; then
|
|
1496
|
+
_pass "undeclared reporter fails with actionable message"
|
|
1497
|
+
else
|
|
1498
|
+
_fail "undeclared-reporter failure did not name the worker: $(cat "$TMPDIR_EVAL/waves-undeclared-reporter.out")"
|
|
1499
|
+
fi
|
|
1500
|
+
|
|
1501
|
+
# Terminal status vocabulary is schema-enforced.
|
|
1502
|
+
mkdir -p "$BAD/waves-bad-status"
|
|
1503
|
+
cat > "$BAD/waves-bad-status/waves.json" <<'JSON'
|
|
1504
|
+
{
|
|
1505
|
+
"schema_version": "1.0",
|
|
1506
|
+
"task_slug": "waves-bad-status",
|
|
1507
|
+
"waves": [
|
|
1508
|
+
{
|
|
1509
|
+
"wave_id": "execute-wave-1",
|
|
1510
|
+
"step": "execute",
|
|
1511
|
+
"declared_at": "2026-07-16T00:00:00Z",
|
|
1512
|
+
"expected_workers": [
|
|
1513
|
+
{"worker_id": "worker-1", "task": "task one"}
|
|
1514
|
+
],
|
|
1515
|
+
"worker_results": [
|
|
1516
|
+
{"worker_id": "worker-1", "status": "maybe-done", "summary": "unclear", "recorded_at": "2026-07-16T01:00:00Z"}
|
|
1517
|
+
]
|
|
1518
|
+
}
|
|
1519
|
+
]
|
|
1520
|
+
}
|
|
1521
|
+
JSON
|
|
1522
|
+
|
|
1523
|
+
if flow_agents_node "$VALIDATOR" "$BAD/waves-bad-status" >"$TMPDIR_EVAL/waves-bad-status.out" 2>&1; then
|
|
1524
|
+
_fail "unknown worker status should fail"
|
|
1525
|
+
elif rg -q 'status must be one of: completed, failed, blocked, not_reported' "$TMPDIR_EVAL/waves-bad-status.out"; then
|
|
1526
|
+
_pass "unknown worker status fails against the schema enum"
|
|
1527
|
+
else
|
|
1528
|
+
_fail "bad-status failure did not mention the status enum: $(cat "$TMPDIR_EVAL/waves-bad-status.out")"
|
|
1529
|
+
fi
|
|
1530
|
+
|
|
1274
1531
|
if [[ "$errors" -eq 0 ]]; then
|
|
1275
1532
|
echo "Workflow artifact integration passed."
|
|
1276
1533
|
exit 0
|
|
@@ -210,6 +210,12 @@ for (const gateId of ["verify-gate", "merge-ready-gate"]) {
|
|
|
210
210
|
for (const [reason, target] of Object.entries(expected)) if (gate.on_route_back?.[reason] !== target) throw new Error(`${gateId} ${reason} should route to ${target}`);
|
|
211
211
|
if (gate.route_back_policy?.on_exceeded !== "block") throw new Error(`${gateId} route_back_policy should block on exceeded attempts`);
|
|
212
212
|
}
|
|
213
|
+
// #695 item (a): pr-open must not be a one-way door — the composed publish-learn
|
|
214
|
+
// pr-open-gate declares the missing_evidence repair route back to verify.
|
|
215
|
+
const prOpenGate = publishLearn.gates?.["pr-open-gate"] || {};
|
|
216
|
+
if (prOpenGate.on_route_back?.missing_evidence !== "verify") throw new Error("pr-open-gate missing_evidence should route to verify");
|
|
217
|
+
if (prOpenGate.on_route_back?.default !== "verify") throw new Error("pr-open-gate default route-back should target verify");
|
|
218
|
+
if (prOpenGate.route_back_policy?.on_exceeded !== "block") throw new Error("pr-open-gate route_back_policy should block on exceeded attempts");
|
|
213
219
|
for (const stepId of ["pr-open", "merge-ready-ci", "learn"]) {
|
|
214
220
|
const step = (flow.steps || []).find((item) => item.id === stepId);
|
|
215
221
|
if (step?.uses_flow !== "builder.publish-learn") throw new Error(`${stepId} should compose builder.publish-learn`);
|
|
@@ -246,6 +246,19 @@ require_text "$PLANNING_CONTRACT" 'Stop-short risks' "planning contract defines
|
|
|
246
246
|
require_text "$PLANNING_CONTRACT" 'Source Evidence / Permalinks' "planning contract requires source evidence permalink expectations"
|
|
247
247
|
require_text "$EXECUTION_CONTRACT" 'Parallel Wave Rules' "execution contract defines parallel wave rules"
|
|
248
248
|
require_text "$EXECUTION_CONTRACT" 'modified files are recorded' "execution contract requires modified files"
|
|
249
|
+
require_text "$EXECUTION_CONTRACT" 'Wave Manifest And Reconciliation' "execution contract defines wave manifest reconciliation (#663)"
|
|
250
|
+
require_text "$EXECUTION_CONTRACT" 'N of M reported' "execution contract requires explicit N-of-M reconciliation language"
|
|
251
|
+
require_text "$EXECUTION_CONTRACT" 'not_reported' "execution contract records missing workers as not_reported"
|
|
252
|
+
require_text "$EXECUTION_CONTRACT" 'never silently absorb' "execution contract forbids silently absorbing missing workers"
|
|
253
|
+
require_text "$EXECUTE_PLAN" 'waves\.json' "execute-plan declares the wave manifest sidecar"
|
|
254
|
+
require_text "$EXECUTE_PLAN" 'N of M reported' "execute-plan reconciles waves with explicit N-of-M language"
|
|
255
|
+
require_text "$EXECUTE_PLAN" 'not_reported' "execute-plan records missing workers as not_reported"
|
|
256
|
+
require_text "$EXECUTE_PLAN" 'reconcile results against the wave manifest' "execute-plan collect step is reconcile-against-manifest"
|
|
257
|
+
require_text "$REVIEW_WORK" 'waves\.json' "review-work declares fan-out reviewer lanes in the wave manifest"
|
|
258
|
+
require_text "$REVIEW_WORK" 'N of M reported' "review-work reconciles reviewer lanes with explicit N-of-M language"
|
|
259
|
+
require_text "$REVIEW_WORK" 'not_reported' "review-work records missing reviewers as not_reported"
|
|
260
|
+
test -f "$ROOT/schemas/workflow-waves.schema.json" && pass "workflow waves schema exists" || fail "workflow waves schema exists"
|
|
261
|
+
require_text "$ROOT/src/cli/validate-workflow-artifacts.ts" 'waves\.json.*workflow-waves\.schema\.json' "validator registers waves.json against the waves schema"
|
|
249
262
|
require_text "$ARTIFACT_LIFECYCLE_DOC" 'current-state dashboard' "artifact lifecycle defines local current-state role"
|
|
250
263
|
require_text "$ARTIFACT_LIFECYCLE_DOC" 'Learning records are a routing surface' "artifact lifecycle defines learning routing semantics"
|
|
251
264
|
require_text "$ARTIFACT_LIFECYCLE_DOC" '14-30 days' "artifact lifecycle documents local retention window"
|
|
@@ -776,6 +789,9 @@ require_text "$BUILDER_BUILD_FLOW" 'probe_status' "Builder build flow names prob
|
|
|
776
789
|
require_text "$BUILDER_BUILD_FLOW" 'probe_artifact_ref' "Builder build flow names probe artifact ref"
|
|
777
790
|
require_text "$BUILDER_BUILD_FLOW" 'Stale broad continuation language after a merge is not sufficient' "Builder build flow blocks stale broad continuation"
|
|
778
791
|
require_text "$BUILDER_BUILD_FLOW" '"uses_flow": "builder.publish-learn"' "Builder build flow composes publish-learn extension"
|
|
792
|
+
require_text "$BUILDER_PUBLISH_LEARN_FLOW" '"on_route_back"' "Builder publish-learn flow declares route-back mappings (#695 item a)"
|
|
793
|
+
require_text "$BUILDER_PUBLISH_LEARN_FLOW" '"missing_evidence": "verify"' "Builder publish-learn pr-open-gate routes missing evidence to verify"
|
|
794
|
+
require_text "$BUILDER_PUBLISH_LEARN_FLOW" '"route_back_policy"' "Builder publish-learn pr-open-gate declares a route-back policy"
|
|
779
795
|
require_text "$BUILDER_PUBLISH_LEARN_FLOW" '"builder.pr-open.pull-request"' "Builder publish-learn flow exports PR-open evidence"
|
|
780
796
|
require_text "$BUILDER_PUBLISH_LEARN_FLOW" '"builder.merge-ready-ci.readiness"' "Builder publish-learn flow exports CI merge readiness evidence"
|
|
781
797
|
require_text "$BUILDER_PUBLISH_LEARN_FLOW" '"builder.learn.evidence"' "Builder publish-learn flow exports learning evidence"
|
|
@@ -72,7 +72,7 @@ if [[ ! -e "$DEST/CLAUDE.md" && ! -L "$DEST/CLAUDE.md" ]]; then
|
|
|
72
72
|
rm -f "$instruction_tmp"
|
|
73
73
|
fi
|
|
74
74
|
if command -v node >/dev/null 2>&1; then
|
|
75
|
-
node "$DEST/scripts/install-merge.js" --config "$DEST/.claude/settings.json" --managed-hooks "$SRC/.claude/settings.json" --version "4.
|
|
75
|
+
node "$DEST/scripts/install-merge.js" --config "$DEST/.claude/settings.json" --managed-hooks "$SRC/.claude/settings.json" --version "4.1.0" --install-record "$DEST/.flow-agents/install.json" --runtime "claude-code" || true
|
|
76
76
|
fi
|
|
77
77
|
if [[ ${#CONSOLE_CONFIG_ARGS[@]} -gt 0 || -n "${FLOW_AGENTS_TELEMETRY_SINK:-}" || -n "${FLOW_AGENTS_TELEMETRY_SINKS:-}" || -n "${FLOW_AGENTS_CONSOLE_URL:-}" || -n "${CONSOLE_TELEMETRY_URL:-}" || -n "${CONSOLE_URL:-}" || -n "${FLOW_AGENTS_CONSOLE_TOKEN_FILE:-}" || -n "${CONSOLE_TELEMETRY_TOKEN_FILE:-}" ]]; then
|
|
78
78
|
bash "$DEST/scripts/telemetry/install-console-config.sh" "$DEST/scripts/telemetry/telemetry.conf" "${CONSOLE_CONFIG_ARGS[@]}"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "builder.publish-learn",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2",
|
|
4
4
|
"description": "Reusable delivery closeout extension: publish the verified change, confirm merge readiness from provider/CI evidence, and record learning feedback.",
|
|
5
5
|
"steps": [
|
|
6
6
|
{ "id": "pr-open", "next": "merge-ready-ci" },
|
|
@@ -17,6 +17,14 @@
|
|
|
17
17
|
"gates": {
|
|
18
18
|
"pr-open-gate": {
|
|
19
19
|
"step": "pr-open",
|
|
20
|
+
"on_route_back": {
|
|
21
|
+
"missing_evidence": "verify",
|
|
22
|
+
"default": "verify"
|
|
23
|
+
},
|
|
24
|
+
"route_back_policy": {
|
|
25
|
+
"max_attempts": 3,
|
|
26
|
+
"on_exceeded": "block"
|
|
27
|
+
},
|
|
20
28
|
"expects": [
|
|
21
29
|
{
|
|
22
30
|
"id": "pull-request-opened",
|
|
@@ -11,7 +11,7 @@ Implement an approved plan while preserving scope, traceability, and recovery co
|
|
|
11
11
|
|
|
12
12
|
- **Role:** canonical Builder build-step producer and standalone execution primitive.
|
|
13
13
|
- **Binding:** `builder.build` step `execute`.
|
|
14
|
-
- **Produces:** the active session execution report (`<slug>--deliver.md`), `state.json`, and `implementation-scope` for an active matching run.
|
|
14
|
+
- **Produces:** the active session execution report (`<slug>--deliver.md`), `state.json`, the wave manifest (`waves.json`) for delegated waves, and `implementation-scope` for an active matching run.
|
|
15
15
|
- **Standalone no-run behavior:** execute the supplied plan and return execution evidence. Do not start a Builder run, record Builder evidence, or imply that an inactive Builder flow advanced.
|
|
16
16
|
|
|
17
17
|
## Model Routing
|
|
@@ -33,8 +33,8 @@ Use `RepositoryAdapter` for repository, target revision, worktree, and changed-f
|
|
|
33
33
|
|
|
34
34
|
1. Read the plan. Return it to `plan-work` when it lacks a Definition Of Done, stable acceptance criteria, task mapping, sandbox boundary, or usable execution scope.
|
|
35
35
|
2. Before delegation, compare the current target revision with the plan's base through `RepositoryAdapter`. Re-ground the plan when changed scope intersects its assumptions; record missing confirmation as `NOT_VERIFIED` rather than treating it as fresh.
|
|
36
|
-
3.
|
|
37
|
-
4. Run safe independent tasks concurrently and dependent tasks in order. Between waves, collect
|
|
36
|
+
3. Before dispatching a wave that delegates work, declare it in the session's wave manifest (`waves.json`, schema `schemas/workflow-waves.schema.json`): `wave_id`, owning step, and one `expected_workers` entry per worker, so the expected worker count (M) exists before any result arrives. Then give each worker its bounded task, owned files, relevant acceptance IDs, required evidence, sandbox/worktree constraints, rollback conditions, and plan reference.
|
|
37
|
+
4. Run safe independent tasks concurrently and dependent tasks in order. Between waves, reconcile results against the wave manifest — never collect from memory or prose. Every declared worker must land exactly one terminal status record (`completed`, `failed`, or `blocked`). Record each declared worker that has no terminal record as `not_reported` — never silently absorb a missing worker — then record the wave's `reconciliation` with an explicit "N of M reported" summary naming the `not_reported` workers (for example "2 of 3 reported; worker-3 not_reported"). Treat the wave as complete only when N equals M; an incomplete wave is visible data that routes to re-dispatch, a blocker, or an explicit accepted gap. After reconciliation, resolve conflicts and update the execution record with completed work, remaining work, changed files, and supported acceptance criteria.
|
|
38
38
|
5. For UI tasks, include the applicable frontend design guidance in the worker instruction.
|
|
39
39
|
6. When implementation completes, record scope integrity: changed files, accepted deviations, task-to-criterion traceability, evidence, and outstanding gaps. Hand off to report-only review and verification; do not treat implementation as verification.
|
|
40
40
|
7. Reconcile the execution report and `state.json` with the active session artifact directory.
|
|
@@ -49,6 +49,7 @@ The execution record must identify:
|
|
|
49
49
|
- each completed task and its supported `AC*` identifiers
|
|
50
50
|
- changed files and any scope deviation with approval or route-back reason
|
|
51
51
|
- worker evidence, conflicts, rollback notes, remaining work, and next action
|
|
52
|
+
- per-wave reconciliation against the manifest: "N of M reported" and any `not_reported` workers with their recovery route
|
|
52
53
|
- current revision comparison and re-grounding decision
|
|
53
54
|
|
|
54
55
|
## Active Builder Evidence
|