@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
|
@@ -5,19 +5,24 @@ import { parseKitFlowStepActions, workflowTriggerIdentifier } from "./action-met
|
|
|
5
5
|
import { validateActionRepositoryMetadata } from "./action-repository-validation.js";
|
|
6
6
|
export { isObservableBuilderArtifactRef, isSafeBuilderArtifactRef, parseKitFlowStepActions } from "./action-metadata.js";
|
|
7
7
|
// Extension-only asset classes: validated by Flow Agents. Flows are validated by @kontourai/flow.
|
|
8
|
-
const EXTENSION_ASSET_CLASSES = ["skills", "docs", "adapters", "evals", "assets"];
|
|
8
|
+
const EXTENSION_ASSET_CLASSES = ["skills", "docs", "adapters", "evals", "assets", "provisions"];
|
|
9
9
|
// Core container fields owned by kontourai/flow (flow-kit-container.schema.json).
|
|
10
10
|
// agent-extension fields are skills, docs, adapters, evals, assets.
|
|
11
11
|
const CORE_CONTAINER_FIELDS = new Set(["schema_version", "id", "name", "description", "product_name", "flows"]);
|
|
12
|
-
const AGENT_EXTENSION_CLASSES = new Set(["skills", "docs", "adapters", "evals", "assets"]);
|
|
12
|
+
const AGENT_EXTENSION_CLASSES = new Set(["skills", "docs", "adapters", "evals", "assets", "provisions"]);
|
|
13
13
|
// Flow Agents-recognized metadata fields that are neither core container fields nor
|
|
14
14
|
// agent-extension asset classes. Recognized here so they are never misreported as
|
|
15
15
|
// unknown third-party extension namespaces. `dependencies` declares cross-kit skill
|
|
16
16
|
// dependencies (extension-layer ownership; see docs/adr/0019-kit-dependency-ownership.md),
|
|
17
17
|
// workflow_triggers / hook_influence_expectations declare kit-owned runtime influence,
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
|
|
18
|
+
// agent_spawn_triggers declares perimeter trigger surfaces that spawn agent runs plus
|
|
19
|
+
// their guard config (context/contracts/trigger-guards.md), and first_party is legacy
|
|
20
|
+
// catalog/marketplace metadata. It does not grant runtime capability or steering privilege.
|
|
21
|
+
const KNOWN_METADATA_FIELDS = new Set(["dependencies", "workflow_triggers", "hook_influence_expectations", "flow_step_actions", "skill_roles", "first_party", "agent_spawn_triggers"]);
|
|
22
|
+
// Consumer-repo-relative directory (posix, lowercase) where the engine writes its own
|
|
23
|
+
// per-kit provision manifest. Reserved: a provision may not target inside it. Shared with
|
|
24
|
+
// provision.ts so the reservation and the actual manifest write stay in agreement.
|
|
25
|
+
export const PROVISION_MANIFEST_DIR = ".kontourai/flow-agents/provisions";
|
|
21
26
|
/**
|
|
22
27
|
* Parse and shape-validate a kit manifest's `dependencies` field (Flow Agents
|
|
23
28
|
* extension-layer metadata; see docs/adr/0019-kit-dependency-ownership.md).
|
|
@@ -221,6 +226,120 @@ export function parseKitHookInfluenceExpectations(manifest, manifestPath) {
|
|
|
221
226
|
});
|
|
222
227
|
return { entries, errors };
|
|
223
228
|
}
|
|
229
|
+
const AGENT_SPAWN_TRIGGER_GUARD_FIELDS = ["dedup_key", "cooldown_seconds", "daily_cap", "max_concurrent"];
|
|
230
|
+
/**
|
|
231
|
+
* Parse and shape-validate a kit manifest's optional `agent_spawn_triggers` field:
|
|
232
|
+
* perimeter trigger surfaces (check failures, schedules, watchers) that spawn agent
|
|
233
|
+
* runs, plus their guard config. Contract: context/contracts/trigger-guards.md.
|
|
234
|
+
*
|
|
235
|
+
* Shape rules (ERRORS):
|
|
236
|
+
* - `agent_spawn_triggers` (if present) must be an array of objects.
|
|
237
|
+
* - `id` must match the workflow-trigger identifier pattern and be unique.
|
|
238
|
+
* - `description` must be a non-empty string.
|
|
239
|
+
* - `spawns_agent_runs` must be a boolean.
|
|
240
|
+
* - `guards` (if present) must be an object with exactly the four guard fields when
|
|
241
|
+
* complete: `dedup_key` non-empty string; `cooldown_seconds`, `daily_cap`,
|
|
242
|
+
* `max_concurrent` integers >= 1. Unknown guard fields are errors.
|
|
243
|
+
*
|
|
244
|
+
* Guard-completeness (WARNINGS, never errors — declaration-first rollout, #664):
|
|
245
|
+
* - an entry with `spawns_agent_runs: true` and missing or incomplete `guards`
|
|
246
|
+
* produces a warning naming the missing guard fields and the contract doc.
|
|
247
|
+
*/
|
|
248
|
+
export function parseKitAgentSpawnTriggers(manifest, manifestPath) {
|
|
249
|
+
const entries = [];
|
|
250
|
+
const errors = [];
|
|
251
|
+
const warnings = [];
|
|
252
|
+
const raw = manifest.agent_spawn_triggers;
|
|
253
|
+
if (raw === undefined)
|
|
254
|
+
return { entries, errors, warnings };
|
|
255
|
+
if (!Array.isArray(raw)) {
|
|
256
|
+
errors.push(`${manifestPath}: .agent_spawn_triggers must be a list`);
|
|
257
|
+
return { entries, errors, warnings };
|
|
258
|
+
}
|
|
259
|
+
const fields = new Set(["id", "description", "spawns_agent_runs", "guards"]);
|
|
260
|
+
const seen = new Set();
|
|
261
|
+
raw.forEach((entry, index) => {
|
|
262
|
+
if (typeof entry !== "object" || entry === null) {
|
|
263
|
+
errors.push(`${manifestPath}: agent_spawn_triggers[${index}] must be an object`);
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
const record = entry;
|
|
267
|
+
const unknown = Object.keys(record).filter((field) => !fields.has(field));
|
|
268
|
+
if (unknown.length > 0) {
|
|
269
|
+
errors.push(`${manifestPath}: agent_spawn_triggers[${index}] contains unsupported field(s): ${unknown.join(", ")}`);
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
const id = record.id;
|
|
273
|
+
if (!workflowTriggerIdentifier(id)) {
|
|
274
|
+
errors.push(`${manifestPath}: agent_spawn_triggers[${index}].id must match ^[a-z0-9]+(?:[.-][a-z0-9]+)*$`);
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
if (seen.has(id)) {
|
|
278
|
+
errors.push(`${manifestPath}: agent_spawn_triggers[${index}].id duplicates '${id}'`);
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
seen.add(id);
|
|
282
|
+
if (typeof record.description !== "string" || !record.description.trim()) {
|
|
283
|
+
errors.push(`${manifestPath}: agent_spawn_triggers[${index}].description must be a non-empty string`);
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
if (typeof record.spawns_agent_runs !== "boolean") {
|
|
287
|
+
errors.push(`${manifestPath}: agent_spawn_triggers[${index}].spawns_agent_runs must be a boolean`);
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
let guards;
|
|
291
|
+
let guardsShapeValid = true;
|
|
292
|
+
const missingGuardFields = [];
|
|
293
|
+
if (record.guards !== undefined) {
|
|
294
|
+
if (typeof record.guards !== "object" || record.guards === null || Array.isArray(record.guards)) {
|
|
295
|
+
errors.push(`${manifestPath}: agent_spawn_triggers[${index}].guards must be an object when present`);
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
const guardRecord = record.guards;
|
|
299
|
+
const guardFieldSet = new Set(AGENT_SPAWN_TRIGGER_GUARD_FIELDS);
|
|
300
|
+
const unknownGuards = Object.keys(guardRecord).filter((field) => !guardFieldSet.has(field));
|
|
301
|
+
if (unknownGuards.length > 0) {
|
|
302
|
+
errors.push(`${manifestPath}: agent_spawn_triggers[${index}].guards contains unsupported field(s): ${unknownGuards.join(", ")}`);
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
if (guardRecord.dedup_key !== undefined && (typeof guardRecord.dedup_key !== "string" || !guardRecord.dedup_key.trim())) {
|
|
306
|
+
errors.push(`${manifestPath}: agent_spawn_triggers[${index}].guards.dedup_key must be a non-empty string`);
|
|
307
|
+
guardsShapeValid = false;
|
|
308
|
+
}
|
|
309
|
+
for (const field of ["cooldown_seconds", "daily_cap", "max_concurrent"]) {
|
|
310
|
+
const value = guardRecord[field];
|
|
311
|
+
if (value !== undefined && (typeof value !== "number" || !Number.isInteger(value) || value < 1)) {
|
|
312
|
+
errors.push(`${manifestPath}: agent_spawn_triggers[${index}].guards.${field} must be an integer >= 1`);
|
|
313
|
+
guardsShapeValid = false;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
if (!guardsShapeValid)
|
|
317
|
+
return;
|
|
318
|
+
for (const field of AGENT_SPAWN_TRIGGER_GUARD_FIELDS) {
|
|
319
|
+
if (guardRecord[field] === undefined)
|
|
320
|
+
missingGuardFields.push(field);
|
|
321
|
+
}
|
|
322
|
+
if (missingGuardFields.length === 0) {
|
|
323
|
+
guards = {
|
|
324
|
+
dedup_key: guardRecord.dedup_key,
|
|
325
|
+
cooldown_seconds: guardRecord.cooldown_seconds,
|
|
326
|
+
daily_cap: guardRecord.daily_cap,
|
|
327
|
+
max_concurrent: guardRecord.max_concurrent,
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
else {
|
|
332
|
+
missingGuardFields.push(...AGENT_SPAWN_TRIGGER_GUARD_FIELDS);
|
|
333
|
+
}
|
|
334
|
+
if (record.spawns_agent_runs === true && missingGuardFields.length > 0) {
|
|
335
|
+
warnings.push(`${manifestPath}: agent_spawn_triggers[${index}] ('${id}') spawns agent runs without complete guard config` +
|
|
336
|
+
` (missing: ${missingGuardFields.join(", ")}); declare dedup_key, cooldown_seconds, daily_cap, and max_concurrent` +
|
|
337
|
+
` per context/contracts/trigger-guards.md`);
|
|
338
|
+
}
|
|
339
|
+
entries.push({ id, description: record.description, spawns_agent_runs: record.spawns_agent_runs, ...(guards ? { guards } : {}) });
|
|
340
|
+
});
|
|
341
|
+
return { entries, errors, warnings };
|
|
342
|
+
}
|
|
224
343
|
export function parseKitSkillRoles(manifest, manifestPath) {
|
|
225
344
|
const entries = [];
|
|
226
345
|
const errors = [];
|
|
@@ -393,7 +512,17 @@ export async function deriveKitTargets(manifest, kitDir = "", sourceRoot = proce
|
|
|
393
512
|
};
|
|
394
513
|
}
|
|
395
514
|
export async function validateKitRepository(kitDir) {
|
|
515
|
+
return (await validateKitRepositoryDiagnostics(kitDir)).errors;
|
|
516
|
+
}
|
|
517
|
+
/**
|
|
518
|
+
* Repository validation with a non-blocking warnings channel alongside the blocking
|
|
519
|
+
* errors `validateKitRepository` has always returned. Warnings are advisory quality
|
|
520
|
+
* findings (today: an agent-spawning trigger surface declared without complete guard
|
|
521
|
+
* config — context/contracts/trigger-guards.md); they never fail validation.
|
|
522
|
+
*/
|
|
523
|
+
export async function validateKitRepositoryDiagnostics(kitDir) {
|
|
396
524
|
const errors = [];
|
|
525
|
+
const warnings = [];
|
|
397
526
|
const manifestPath = path.join(kitDir, "kit.json");
|
|
398
527
|
let manifest;
|
|
399
528
|
try {
|
|
@@ -401,14 +530,16 @@ export async function validateKitRepository(kitDir) {
|
|
|
401
530
|
}
|
|
402
531
|
catch (error) {
|
|
403
532
|
errors.push(`${manifestPath}: invalid JSON: ${error.message}`);
|
|
404
|
-
return errors;
|
|
533
|
+
return { errors, warnings };
|
|
405
534
|
}
|
|
406
535
|
errors.push(...await delegateCoreContainerValidation(kitDir, manifest));
|
|
407
536
|
errors.push(...validateExtensionAssets(kitDir, manifestPath, manifest));
|
|
408
|
-
|
|
537
|
+
const metadata = validateAgentMetadata(kitDir, manifestPath, manifest);
|
|
538
|
+
errors.push(...metadata.errors);
|
|
539
|
+
warnings.push(...metadata.warnings);
|
|
409
540
|
if (manifest.first_party !== undefined && typeof manifest.first_party !== "boolean")
|
|
410
541
|
errors.push(`${manifestPath}: .first_party must be a boolean when present`);
|
|
411
|
-
return errors;
|
|
542
|
+
return { errors, warnings };
|
|
412
543
|
}
|
|
413
544
|
function validateExtensionAssets(kitDir, manifestPath, manifest) {
|
|
414
545
|
const errors = [];
|
|
@@ -429,11 +560,15 @@ function validateExtensionAssets(kitDir, manifestPath, manifest) {
|
|
|
429
560
|
const record = entry;
|
|
430
561
|
const id = record.id;
|
|
431
562
|
const rel = record.path;
|
|
563
|
+
const kitId = typeof manifest.id === "string" ? manifest.id : "";
|
|
432
564
|
if (typeof id === "string") {
|
|
433
565
|
if (seen.has(id))
|
|
434
566
|
errors.push(`${manifestPath}: ${section}[${index}].id duplicates`);
|
|
435
567
|
seen.add(id);
|
|
436
568
|
}
|
|
569
|
+
if (section === "provisions" && (typeof id !== "string" || !kitId || !id.startsWith(`${kitId}.`))) {
|
|
570
|
+
errors.push(`${manifestPath}: provisions[${index}].id must be prefixed with '${kitId}.'`);
|
|
571
|
+
}
|
|
437
572
|
if (typeof rel !== "string" || !rel) {
|
|
438
573
|
errors.push(`${manifestPath}: ${section}[${index}].path must be a string`);
|
|
439
574
|
return;
|
|
@@ -442,6 +577,10 @@ function validateExtensionAssets(kitDir, manifestPath, manifest) {
|
|
|
442
577
|
errors.push(`${manifestPath}: ${section}[${index}].path must be relative`);
|
|
443
578
|
return;
|
|
444
579
|
}
|
|
580
|
+
if (rel.replace(/\\/g, "/").split("/").includes("..")) {
|
|
581
|
+
errors.push(`${manifestPath}: ${section}[${index}].path must not contain traversal segments`);
|
|
582
|
+
return;
|
|
583
|
+
}
|
|
445
584
|
const resolved = path.resolve(kitDir, rel);
|
|
446
585
|
const root = path.resolve(kitDir);
|
|
447
586
|
if (resolved !== root && !resolved.startsWith(`${root}${path.sep}`)) {
|
|
@@ -451,12 +590,73 @@ function validateExtensionAssets(kitDir, manifestPath, manifest) {
|
|
|
451
590
|
if (!fs.existsSync(resolved)) {
|
|
452
591
|
errors.push(`${manifestPath}: ${section}[${index}].path points at missing asset: ${rel}`);
|
|
453
592
|
}
|
|
593
|
+
else if (section === "provisions") {
|
|
594
|
+
if (!fs.statSync(resolved).isFile()) {
|
|
595
|
+
errors.push(`${manifestPath}: provisions[${index}].path must point at a file: ${rel}`);
|
|
596
|
+
}
|
|
597
|
+
else {
|
|
598
|
+
// A provisioned source is copied byte-for-byte into a consumer repo, so a symlink that
|
|
599
|
+
// resolves outside the kit would exfiltrate arbitrary readable host files. Require the
|
|
600
|
+
// link-resolved real path to stay inside the kit.
|
|
601
|
+
const realResolved = fs.realpathSync(resolved);
|
|
602
|
+
const realRoot = fs.realpathSync(root);
|
|
603
|
+
if (realResolved !== realRoot && !realResolved.startsWith(`${realRoot}${path.sep}`)) {
|
|
604
|
+
errors.push(`${manifestPath}: provisions[${index}].path must not resolve outside the kit directory`);
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
});
|
|
609
|
+
}
|
|
610
|
+
const rawProvisions = manifest.provisions;
|
|
611
|
+
if (Array.isArray(rawProvisions)) {
|
|
612
|
+
const targets = new Set();
|
|
613
|
+
rawProvisions.forEach((entry, index) => {
|
|
614
|
+
if (typeof entry !== "object" || entry === null)
|
|
615
|
+
return;
|
|
616
|
+
const record = entry;
|
|
617
|
+
if (record.description !== undefined && typeof record.description !== "string") {
|
|
618
|
+
errors.push(`${manifestPath}: provisions[${index}].description must be a string when present`);
|
|
619
|
+
}
|
|
620
|
+
const target = record.target;
|
|
621
|
+
if (typeof target !== "string" || target.trim().length === 0) {
|
|
622
|
+
errors.push(`${manifestPath}: provisions[${index}].target must be a non-empty string`);
|
|
623
|
+
return;
|
|
624
|
+
}
|
|
625
|
+
if (path.isAbsolute(target) || path.win32.isAbsolute(target)) {
|
|
626
|
+
errors.push(`${manifestPath}: provisions[${index}].target must be relative`);
|
|
627
|
+
return;
|
|
628
|
+
}
|
|
629
|
+
const segments = target.replace(/\\/g, "/").split("/");
|
|
630
|
+
if (segments.includes("..")) {
|
|
631
|
+
errors.push(`${manifestPath}: provisions[${index}].target must not contain traversal segments`);
|
|
632
|
+
return;
|
|
633
|
+
}
|
|
634
|
+
const normalized = path.posix.normalize(segments.join("/"));
|
|
635
|
+
if (normalized === "." || normalized.startsWith("..")) {
|
|
636
|
+
errors.push(`${manifestPath}: provisions[${index}].target must stay inside the consumer repository`);
|
|
637
|
+
return;
|
|
638
|
+
}
|
|
639
|
+
// Case-fold reserved-directory and collision checks: on a case-insensitive filesystem
|
|
640
|
+
// `.GIT/` still lands in the real `.git`, and README.md/readme.md still collide.
|
|
641
|
+
const lowered = normalized.toLowerCase();
|
|
642
|
+
if (lowered === ".git" || lowered.startsWith(".git/")) {
|
|
643
|
+
errors.push(`${manifestPath}: provisions[${index}].target must not be inside .git`);
|
|
644
|
+
return;
|
|
645
|
+
}
|
|
646
|
+
if (lowered === PROVISION_MANIFEST_DIR || lowered.startsWith(`${PROVISION_MANIFEST_DIR}/`)) {
|
|
647
|
+
errors.push(`${manifestPath}: provisions[${index}].target must not be inside the provision manifest namespace (${PROVISION_MANIFEST_DIR}/)`);
|
|
648
|
+
return;
|
|
649
|
+
}
|
|
650
|
+
if (targets.has(lowered))
|
|
651
|
+
errors.push(`${manifestPath}: provisions[${index}].target duplicates '${normalized}'`);
|
|
652
|
+
targets.add(lowered);
|
|
454
653
|
});
|
|
455
654
|
}
|
|
456
655
|
return errors;
|
|
457
656
|
}
|
|
458
657
|
function validateAgentMetadata(kitDir, manifestPath, manifest) {
|
|
459
658
|
const errors = [];
|
|
659
|
+
const warnings = [];
|
|
460
660
|
const depResult = parseKitDependencies(manifest, manifestPath);
|
|
461
661
|
for (const err of depResult.errors)
|
|
462
662
|
errors.push(err);
|
|
@@ -466,6 +666,11 @@ function validateAgentMetadata(kitDir, manifestPath, manifest) {
|
|
|
466
666
|
const hookExpectationResult = parseKitHookInfluenceExpectations(manifest, manifestPath);
|
|
467
667
|
for (const err of hookExpectationResult.errors)
|
|
468
668
|
errors.push(err);
|
|
669
|
+
const agentSpawnTriggerResult = parseKitAgentSpawnTriggers(manifest, manifestPath);
|
|
670
|
+
for (const err of agentSpawnTriggerResult.errors)
|
|
671
|
+
errors.push(err);
|
|
672
|
+
for (const warning of agentSpawnTriggerResult.warnings)
|
|
673
|
+
warnings.push(warning);
|
|
469
674
|
const flowStepActionResult = parseKitFlowStepActions(manifest, manifestPath);
|
|
470
675
|
for (const err of flowStepActionResult.errors)
|
|
471
676
|
errors.push(err);
|
|
@@ -475,7 +680,7 @@ function validateAgentMetadata(kitDir, manifestPath, manifest) {
|
|
|
475
680
|
if ((manifest.skill_roles !== undefined || manifest.flow_step_actions !== undefined) && skillRoleResult.errors.length === 0) {
|
|
476
681
|
errors.push(...validateActionRepositoryMetadata({ kitDir, manifestPath, manifest, actions: flowStepActionResult.entries, skillRoles: skillRoleResult.entries }));
|
|
477
682
|
}
|
|
478
|
-
return errors;
|
|
683
|
+
return { errors, warnings };
|
|
479
684
|
}
|
|
480
685
|
export async function assertKitRepository(kitDir) {
|
|
481
686
|
const errors = await validateKitRepository(kitDir);
|
|
@@ -3,7 +3,7 @@ import * as path from "node:path";
|
|
|
3
3
|
import { atomicCopyFile, atomicWriteJson, ensureSafeDirectory, readJson, relPath } from "./lib/fs.js";
|
|
4
4
|
import { flowAgentsArtifactRoot } from "./lib/local-artifact-root.js";
|
|
5
5
|
import { parseKitDependencies, parseKitHookInfluenceExpectations, parseKitWorkflowTriggers } from "./flow-kit/validate.js";
|
|
6
|
-
const ASSET_CLASSES = ["flows", "skills", "docs", "adapters", "evals", "assets"];
|
|
6
|
+
const ASSET_CLASSES = ["flows", "skills", "docs", "adapters", "evals", "assets", "provisions"];
|
|
7
7
|
const KIT_ID_RE = /^[a-z][a-z0-9-]*$/;
|
|
8
8
|
function assetPath(root, value) {
|
|
9
9
|
if (path.isAbsolute(value))
|
|
@@ -42,7 +42,36 @@ Execution may upgrade to a stronger mode when risk increases. Downgrades require
|
|
|
42
42
|
- Independent tasks with no shared files can run in the same wave.
|
|
43
43
|
- Shared files, generated artifacts, migrations, and cross-cutting contracts should be serialized unless the plan gives explicit file ownership.
|
|
44
44
|
- Worker delegation must name the exact worker role (`tool-worker`) rather than spawning an unnamed/default implementation agent.
|
|
45
|
-
- After each wave,
|
|
45
|
+
- After each wave, reconcile results against the wave manifest (below), check conflicts, and update the session artifact before starting the next wave.
|
|
46
|
+
|
|
47
|
+
## Wave Manifest And Reconciliation
|
|
48
|
+
|
|
49
|
+
Fan-out collection is machine-checkable, not prose. A reduce step that silently
|
|
50
|
+
drops a worker's stream is worse than one that errors.
|
|
51
|
+
|
|
52
|
+
- **Declare before dispatch.** Before dispatching a wave that delegates work,
|
|
53
|
+
declare it in the session's `waves.json` sidecar (schema:
|
|
54
|
+
`schemas/workflow-waves.schema.json`): `wave_id`, owning step, and one
|
|
55
|
+
`expected_workers` entry per worker. The expected count (M) must exist before
|
|
56
|
+
any result arrives.
|
|
57
|
+
- **One terminal record per worker.** Each worker lands exactly one terminal
|
|
58
|
+
status record: `completed`, `failed`, or `blocked`. Duplicate records and
|
|
59
|
+
undeclared reporters are validation errors.
|
|
60
|
+
- **Reconcile at wave close.** The orchestrator's collect step is
|
|
61
|
+
reconcile-against-manifest: record every declared worker that has no terminal
|
|
62
|
+
record as `not_reported` — never silently absorb a missing worker — then
|
|
63
|
+
record the wave's `reconciliation` with `expected_count` M, `reported_count`
|
|
64
|
+
N, and an explicit "N of M reported" summary naming the `not_reported`
|
|
65
|
+
workers (for example "2 of 3 reported; worker-3 not_reported").
|
|
66
|
+
- **Incomplete is visible, never silent.** A wave is `complete` only when N
|
|
67
|
+
equals M. An incomplete wave stays visible data and routes to re-dispatch, a
|
|
68
|
+
blocker report, or an explicit accepted gap; it must never be treated as
|
|
69
|
+
complete because the missing worker was forgotten.
|
|
70
|
+
- **Enforcement boundary (slice 1).** `validate-workflow-artifacts` enforces
|
|
71
|
+
the shape and the cross-record arithmetic (counts, exactly-one-record,
|
|
72
|
+
undeclared reporters, impossible `complete` claims) as data-level validation.
|
|
73
|
+
Stop-hook refusal of wave completion is #663 part 3 (slice 2), deferred until
|
|
74
|
+
the hook correctness issues (#453/#450/#494) are resolved.
|
|
46
75
|
|
|
47
76
|
## Delegation: Model Routing
|
|
48
77
|
|
|
@@ -100,6 +100,10 @@ npm run workflow:sidecar -- import-critique .kontourai/flow-agents/<slug> \
|
|
|
100
100
|
--reviewer tool-code-reviewer
|
|
101
101
|
```
|
|
102
102
|
|
|
103
|
+
A security-review finding is recorded as a structured verdict + reference — `{severity, file_refs: ["path:line"], description: "<one-line weakness>"}` — not as reproduced exploit payloads or copied vulnerable-code blocks. A precise reference is sufficient evidence; the fuller remediation detail belongs in the fix pass, not the recorded finding. This keeps security findings recordable even when the reviewer runtime's provider content-filters exploit-shaped prose.
|
|
104
|
+
|
|
105
|
+
Recording a review requires a reviewer identity distinct from the active implementation-assignment actor (anti-self-review). The identity is derived from the runtime actor, so an orchestrator that implemented cannot also review under the same actor: run the reviewer under a distinct actor — set `FLOW_AGENTS_ACTOR=<reviewer-id>` on the reviewing process, or run it in a separate runtime session.
|
|
106
|
+
|
|
103
107
|
## Gate Rules
|
|
104
108
|
|
|
105
109
|
- Critical or high findings block delivery until fixed, accepted by the user, deferred with explicit rationale, or marked false positive.
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Trigger-Spawned Agent Run Guards Contract
|
|
2
|
+
|
|
3
|
+
> Read [`context/contracts/standing-directives.md`](standing-directives.md) — ratified owner directives that override default engineering conservatism.
|
|
4
|
+
|
|
5
|
+
Any kit, hook, or integration that spawns an agent run from a trigger MUST declare, before it ships, how that spawn surface is guarded against runaway amplification. A trigger with no dedup, cooldown, cap, or concurrency guard converts one flapping upstream signal into an unbounded stream of agent runs — each of which may hold permissions, spend budget, and mutate state without a human turn in the loop. A 2026-07 field near-miss made this concrete: an on-failure escalation wired without these guards would have spawned a continuous stream of permission-skipping agent runs from a single flapping check. This contract makes the guard requirements standing suite policy so the next trigger-driven feature inherits them by default instead of rediscovering them in an incident.
|
|
6
|
+
|
|
7
|
+
## Scope
|
|
8
|
+
|
|
9
|
+
A **trigger-spawned agent run** is any agent execution started by an event rather than by a human request in an interactive session: a check or CI failure escalation, a schedule firing, a watcher or automation trigger, or any other perimeter event that launches headless agent work.
|
|
10
|
+
|
|
11
|
+
Out of scope:
|
|
12
|
+
|
|
13
|
+
- `workflow_triggers` in kit.json — in-session workflow steering for an already-running interactive session. Steering routes an existing session; it does not spawn a run.
|
|
14
|
+
- Subagent delegation inside an active, human-initiated session — the session itself is the supervision boundary.
|
|
15
|
+
|
|
16
|
+
No flow-agents hook spawns agent runs today (all four hook policy classes are advisory/steering), but the suite's perimeter already does, and in-repo consumers are planned (see "Future consumers" below). The contract applies the moment a surface CAN spawn a run, not the moment it misbehaves.
|
|
17
|
+
|
|
18
|
+
## Required Guard Declarations
|
|
19
|
+
|
|
20
|
+
Every trigger surface that spawns agent runs declares all four guards, with explicit values. The defaults below are the starting point when the feature has no measured reason to differ; declaring a weaker value than the default requires a recorded rationale on the owning work item.
|
|
21
|
+
|
|
22
|
+
| Guard | Field | Meaning | Default |
|
|
23
|
+
| --- | --- | --- | --- |
|
|
24
|
+
| Dedup | `dedup_key` | The trigger-signature expression used to suppress duplicate spawns while an equivalent run is pending or was recently spawned. For failure escalations: subject plus normalized failure signature (e.g. `check-name+failure-signature`), so a repeat of the same failure does not spawn a second run. | subject + trigger signature |
|
|
25
|
+
| Cooldown | `cooldown_seconds` | Minimum seconds between spawns for the same subject, regardless of signature churn. | `900` |
|
|
26
|
+
| Daily cap | `daily_cap` | Maximum spawns per trigger surface per day; the surface goes quiet (with a visible, non-silent skip) once reached. | `20` |
|
|
27
|
+
| Concurrency lock | `max_concurrent` | Maximum runs from this surface allowed to exist simultaneously, expressed as a limit; `1` is a mutual-exclusion lock. | `1` |
|
|
28
|
+
|
|
29
|
+
A skipped spawn (dedup hit, cooldown window, cap reached, lock held) must be observable — logged or counted, never silently dropped — so a guard absorbing real signal is diagnosable.
|
|
30
|
+
|
|
31
|
+
## Kit Declaration: `agent_spawn_triggers`
|
|
32
|
+
|
|
33
|
+
Kits declare agent-spawning trigger surfaces in kit.json through the optional `agent_spawn_triggers` extension field (Flow Agents extension-layer metadata, like `dependencies` and `workflow_triggers`):
|
|
34
|
+
|
|
35
|
+
```jsonc
|
|
36
|
+
"agent_spawn_triggers": [
|
|
37
|
+
{
|
|
38
|
+
"id": "on-check-failure",
|
|
39
|
+
"description": "Escalates failing checks to a headless agent run.",
|
|
40
|
+
"spawns_agent_runs": true,
|
|
41
|
+
"guards": {
|
|
42
|
+
"dedup_key": "check-name+failure-signature",
|
|
43
|
+
"cooldown_seconds": 900,
|
|
44
|
+
"daily_cap": 20,
|
|
45
|
+
"max_concurrent": 1
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
- `id`: unique identifier (`^[a-z0-9]+(?:[.-][a-z0-9]+)*$`).
|
|
52
|
+
- `description`: non-empty human-readable purpose of the surface.
|
|
53
|
+
- `spawns_agent_runs`: required boolean. `false` documents a trigger surface that fires without spawning agent runs (e.g. notification-only); such entries need no guards.
|
|
54
|
+
- `guards`: required-complete when `spawns_agent_runs` is `true` — all four fields, `dedup_key` a non-empty string, the three numeric guards integers >= 1.
|
|
55
|
+
|
|
56
|
+
Hooks and integrations that live outside a kit manifest declare the same four guards, with the same vocabulary, in their own configuration or design artifact.
|
|
57
|
+
|
|
58
|
+
## Enforcement
|
|
59
|
+
|
|
60
|
+
Kit repository validation emits a **WARNING** (not an error) when an `agent_spawn_triggers` entry has `spawns_agent_runs: true` and missing or incomplete `guards`. Malformed declarations (wrong types, duplicate ids, non-positive limits) are shape ERRORS like every other extension field.
|
|
61
|
+
|
|
62
|
+
Warning-level enforcement is deliberate, declaration-first rollout: the declaration is new and optional, and no in-repo surface spawns runs yet. When the first in-repo trigger-spawned runner ships, its surface must declare complete guards, and enforcement for spawning surfaces hardens with it (validation error and/or runtime refusal). Runtime guard enforcement is explicitly NOT part of this contract's first iteration — no spawning or guard machinery exists in this repo yet, and per standing directive 4 (standalone-first), the enforcement runtime belongs with the first real spawner.
|
|
63
|
+
|
|
64
|
+
## Conforming Examples
|
|
65
|
+
|
|
66
|
+
- **kontourai/plumb#1** — check-failure escalation to a headless agent with per-subject cooldown, failure-signature dedup, and a max-concurrent cap: the direct antecedent of this contract's `cooldown_seconds`, `dedup_key`, and `max_concurrent` guards.
|
|
67
|
+
- **ephemeris** — trigger firing that is coalesced per claim, idempotent, and rate-limited: dedup and cap expressed as coalescing plus rate limits, showing the guards generalize beyond failure escalation.
|
|
68
|
+
|
|
69
|
+
Both are cited as reference implementations of the guard vocabulary; consult their current sources when implementing a new surface.
|
|
70
|
+
|
|
71
|
+
## Future Consumers
|
|
72
|
+
|
|
73
|
+
The autonomy epic's background-review fork — kontourai/flow-agents#252, under epic #250 — will spawn agent runs from a trigger. Any implementation of #252 MUST declare its guard configuration under this contract (an `agent_spawn_triggers` entry with complete `guards`, or the equivalent declaration in its owning design artifact) before it ships.
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"issue_state": "open",
|
|
42
42
|
"include_labels": [],
|
|
43
43
|
"ready_statuses": ["ready"],
|
|
44
|
-
"exclude_statuses": ["in_progress", "blocked", "review", "verification", "done"]
|
|
44
|
+
"exclude_statuses": ["triage", "in_progress", "blocked", "review", "verification", "done"]
|
|
45
45
|
},
|
|
46
46
|
"wip_policy": {
|
|
47
47
|
"prefer_finishing_active_work": true,
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"issue_state": "open",
|
|
37
37
|
"include_labels": [],
|
|
38
38
|
"ready_statuses": ["ready"],
|
|
39
|
-
"exclude_statuses": ["in_progress", "blocked", "review", "verification", "done"]
|
|
39
|
+
"exclude_statuses": ["triage", "in_progress", "blocked", "review", "verification", "done"]
|
|
40
40
|
},
|
|
41
41
|
"wip_policy": {
|
|
42
42
|
"prefer_finishing_active_work": true,
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "ADR 0023: Declarative Kit Provisioning"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# ADR 0023: Declarative Kit Provisioning
|
|
6
|
+
|
|
7
|
+
**Date:** 2026-07-16
|
|
8
|
+
**Status:** Accepted (owner-ratified Option A in flow-agents#647)
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Context
|
|
13
|
+
|
|
14
|
+
Kits sometimes need to supply repository-owned configuration or policy files in addition to runtime projections. The motivating `veritas-governance` follow-up needs this capability, but embedding kit-specific copy logic in Flow Agents would violate the kit boundary. Runtime activation is also the wrong mechanism: its projection directory is regenerable adapter state, while these files must become normal files in the consumer repository.
|
|
15
|
+
|
|
16
|
+
## Decision
|
|
17
|
+
|
|
18
|
+
A kit may declare a `provisions` list in `kit.json`. Each entry is inert data naming an id, a source file inside the kit, and a consumer-repository-relative target. Provision declarations are never executed.
|
|
19
|
+
|
|
20
|
+
The Flow Agents engine performs agent-blind file copying through an explicit `kit provision` operation. It validates source and target containment, preflights every destination, and creates files only when no declared destination already exists. An explicit `--force` option may replace declared destination files; the default never silently overwrites an anchor-owned or consumer-owned file. `--dry-run` reports the plan without writing.
|
|
21
|
+
|
|
22
|
+
`flow-agents init --activate-kit` invokes the same engine after activation with create-only semantics. Existing destinations are reported as skipped warnings so init remains safe to rerun. Provisioning remains separate from runtime activation and its projection directory.
|
|
23
|
+
|
|
24
|
+
The engine records successful copies under `.kontourai/flow-agents/provisions/<kit-id>.json`. This manifest is bookkeeping and may be replaced on a later successful provisioning operation. Enforcement policy and ownership of protected paths remain anchor-side; a kit declaration does not grant permission to overwrite them.
|
|
25
|
+
|
|
26
|
+
## Consequences
|
|
27
|
+
|
|
28
|
+
- Kits can ship repository files without executable installers or kit-specific engine behavior.
|
|
29
|
+
- Create-only defaults preserve consumer and anchor ownership; replacement requires an explicit user operation.
|
|
30
|
+
- Provisioned files belong to the consumer repository once written. Uninstalling or deactivating a kit never removes or reverts them.
|
|
31
|
+
- Runtime adapters continue to activate only their supported projection assets and report provisions as explicitly skipped.
|
|
32
|
+
- Consumers that need stronger protected-path policy enforce it at their anchor; the generic engine remains deliberately dumb and kit-neutral.
|
|
33
|
+
|
|
34
|
+
## Accepted residuals
|
|
35
|
+
|
|
36
|
+
- **Copy is best-effort against concurrent interposition (both ends).** The checks and the copy
|
|
37
|
+
are separate steps (check-then-act): a file created into a declared destination between the
|
|
38
|
+
conflict preflight and the write can still be overwritten, and a source re-pointed to a link
|
|
39
|
+
between its containment check and its read could resolve elsewhere. Provisioning targets a
|
|
40
|
+
developer/CI working tree, not a hostile multi-writer path, so both TOCTOU windows are accepted
|
|
41
|
+
rather than closed with exclusive-create / open-then-fstat plumbing. The static guarantees are
|
|
42
|
+
enforced up front: reserved-directory (`.git`, the provision manifest namespace), source and
|
|
43
|
+
destination containment (link-resolved), and case-fold collision rejection; concurrent
|
|
44
|
+
interposition on either end is out of scope.
|
|
45
|
+
- **Target case-folding assumes the common single-case-family repo.** Collision and reserved-path
|
|
46
|
+
checks case-fold targets so case-insensitive filesystems are safe; a genuinely case-sensitive
|
|
47
|
+
repo that intends two targets differing only in case is rejected as a portability hazard.
|
|
@@ -32,3 +32,4 @@ Numbered ADRs below are FROZEN immutable history (see the banner on each file).
|
|
|
32
32
|
| 0020 | Trust-Reconcile Manifest, Claim Classification, and Waivers | unknown | [0020-trust-reconcile-manifest-and-claim-classification.md](./0020-trust-reconcile-manifest-and-claim-classification.md) |
|
|
33
33
|
| 0021 | Assignment Leases and Stale-Claim Takeover | 2026-07-02 | [0021-assignment-leases-and-stale-claim-takeover.md](./0021-assignment-leases-and-stale-claim-takeover.md) |
|
|
34
34
|
| 0022 | Fail-Closed Delivery Reconciliation with Governed Exemptions | 2026-07-02 | [0022-fail-closed-delivery-reconciliation-with-governed-exemptions.md](./0022-fail-closed-delivery-reconciliation-with-governed-exemptions.md) |
|
|
35
|
+
| 0023 | Declarative Kit Provisioning | 2026-07-16 | [0023-kit-provisioning.md](./0023-kit-provisioning.md) |
|
|
@@ -102,9 +102,26 @@ Kit trust is orthogonal to engine privilege. A marketplace may call a kit offici
|
|
|
102
102
|
|
|
103
103
|
The answer is determined by validation, activation, and gate evidence, not by a privileged kit list.
|
|
104
104
|
|
|
105
|
+
## The Portfolio Layer Doctrine
|
|
106
|
+
|
|
107
|
+
The engine/kits split here is Flow Agents' instance of the portfolio-wide **Layer Doctrine**
|
|
108
|
+
([surface/docs/architecture/portfolio-layer-doctrine.md](https://github.com/kontourai/surface/blob/main/docs/architecture/portfolio-layer-doctrine.md)):
|
|
109
|
+
dependency direction is one-way up the stack (open trust format → building-block tools → Surface →
|
|
110
|
+
products), and no layer reaches sideways into a peer. A product engine (e.g. `@kontourai/veritas`)
|
|
111
|
+
never depends on the platform, and a **kit consumes an engine only through its CLI + recorded
|
|
112
|
+
artifacts, never as an npm library import** — the whole point of the manifest/catalog model above.
|
|
113
|
+
Both edges are now enforced executably: veritas-side by `check-no-flow-agents-dep.mjs` (the engine
|
|
114
|
+
declares no flow-agents dependency) and here by [`scripts/check-layer-boundary.mjs`](../scripts/check-layer-boundary.mjs)
|
|
115
|
+
(no kit imports the veritas engine as a library). See veritas's
|
|
116
|
+
[Engine / Surface Seam](https://github.com/kontourai/veritas/blob/main/docs/architecture/engine-surface-seam.md)
|
|
117
|
+
for the canonical engine-vs-kit capability inventory that the Veritas Governance Kit row above
|
|
118
|
+
builds on.
|
|
119
|
+
|
|
105
120
|
## Related docs
|
|
106
121
|
|
|
107
122
|
- [Flow Kit Authoring Guide](kit-authoring-guide.md)
|
|
108
123
|
- [Flow Kit Repository Contract](flow-kit-repository-contract.md)
|
|
109
124
|
- [Runtime Hook Surface spec](spec/runtime-hook-surface.md)
|
|
110
125
|
- [Verifiable Trust](verifiable-trust.md)
|
|
126
|
+
- [Veritas Engine / Surface Seam](https://github.com/kontourai/veritas/blob/main/docs/architecture/engine-surface-seam.md) — how `@kontourai/veritas` splits into an engine library + the kit-owned product surface
|
|
127
|
+
- [Portfolio Layer Doctrine](https://github.com/kontourai/surface/blob/main/docs/architecture/portfolio-layer-doctrine.md)
|
|
@@ -71,6 +71,7 @@ Machine-readable workflow state lives beside Markdown artifacts in `.kontourai/f
|
|
|
71
71
|
| workflow-learning.schema.json | Flow Agents Workflow Learning | https://flow-agents.dev/schemas/workflow-learning.schema.json |
|
|
72
72
|
| workflow-release.schema.json | Flow Agents Workflow Release Readiness | https://flow-agents.dev/schemas/workflow-release.schema.json |
|
|
73
73
|
| workflow-state.schema.json | Flow Agents Workflow State | https://flow-agents.dev/schemas/workflow-state.schema.json |
|
|
74
|
+
| workflow-waves.schema.json | Flow Agents Workflow Waves | https://flow-agents.dev/schemas/workflow-waves.schema.json |
|
|
74
75
|
|
|
75
76
|
Primary tools: public `flow-agents workflow`, `trust.bundle`, artifact validation, `scripts/hooks/stop-goal-fit.js`, and `scripts/hooks/workflow-steering.js`. The package-internal writer is not an agent or consumer interface.
|
|
76
77
|
|
|
@@ -100,6 +101,7 @@ Primary tools: public `flow-agents workflow`, `trust.bundle`, artifact validatio
|
|
|
100
101
|
| agentic-engineering | skills/agentic-engineering/SKILL.md | Eval-first execution, task decomposition, and cost-aware model routing for AI-driven development workflows. |
|
|
101
102
|
| browser-test | skills/browser-test/SKILL.md | Headless browser automation via Playwright — screenshots, accessibility checks, form filling, UI testing, DOM inspection. |
|
|
102
103
|
| builder-shape | kits/builder/skills/builder-shape/SKILL.md | Builder Kit shaping entrypoint. Turns a raw idea into a provider-neutral, reviewable backlog proposal and stops before build selection unless the user explicitly continues. |
|
|
104
|
+
| consult-standards | kits/veritas-governance/skills/consult-standards/SKILL.md | Get just-in-time Veritas governance guidance for a file or work area before editing it: run `veritas explain --file <path>` (or `--work-area <id>`) to see the governance excerpt, the Repo Standards rules that apply, their do/don't/exampl... |
|
|
103
105
|
| dependency-update | skills/dependency-update/SKILL.md | Analyze and upgrade project dependencies — latest versions, security vulnerabilities, actionable update plan across all package managers. |
|
|
104
106
|
| design-probe | kits/builder/skills/design-probe/SKILL.md | Generic one-question-at-a-time design probe for turning unclear goals, designs, and handoffs into shared understanding. |
|
|
105
107
|
| eval-rebuild | skills/eval-rebuild/SKILL.md | Project-specific build and install commands for the eval feedback loop. Injected into eval-builder agent. Replace this skill for different build systems. |
|
|
@@ -108,6 +110,7 @@ Primary tools: public `flow-agents workflow`, `trust.bundle`, artifact validatio
|
|
|
108
110
|
| knowledge-capture | kits/knowledge/skills/knowledge-capture/SKILL.md | Save durable knowledge, lightweight pointers, user corrections, decisions, lessons, relationship context, or source references into the knowledge base. Use when the user says save, remember, capture, file this, bookmark context, or when... |
|
|
109
111
|
| pickup-probe | kits/builder/skills/pickup-probe/SKILL.md | Provider-grounded pickup probe used at the Builder design-probe step before planning. |
|
|
110
112
|
| search-first | skills/search-first/SKILL.md | Research-before-coding workflow. Search for existing tools, libraries, and patterns before writing custom code. |
|
|
113
|
+
| standards-authoring | kits/veritas-governance/skills/standards-authoring/SKILL.md | Author or update a repo's Veritas Repo Standards through the kit's standards-authoring flow: run `veritas init --explore`/`--guided` to derive a proposed starter set (project name, repo-shape-adaptive Repo Map nodes, evidence-check infer... |
|
|
111
114
|
|
|
112
115
|
## Agents
|
|
113
116
|
|