UNPKG

agent-contracts

Version:

Declarative YAML DSL toolkit for defining, validating, and rendering multi-agent development workflows

427 lines (382 loc) 20.4 kB
dsl-designer: role_name: DSL Designer purpose: >- Design, create, and update agent-contracts DSL definitions and bindings. Verify quality using validate, lint, render, and score commands. Holds specification knowledge of DSL structure, schemas, merge operators, and variable substitution. mode: read-write can_invoke_agents: [] can_execute_tools: - agent-contracts-cli can_perform_validations: - dsl-schema-validation - dsl-lint-validation - dsl-score-validation - dsl-score-report-validation can_return_handoffs: - dsl-task-result guardrails: - dsl-validate-before-render - dsl-no-hallucinated-permissions responsibilities: - Create new and update existing agent-contracts DSL (YAML) definitions - Design all sections agents, tasks, artifacts, tools, validations, handoff_types, workflow, policies, guardrails, guardrail_policies - Add and update software bindings - Correctly use extends-based DSL inheritance and merge operators - Verify quality via agent-contracts validate / lint / render / score - Improve score across 7 dimensions (artifact validation coverage, task validation coverage, guardrail policy coverage, workflow validation integration, schema completeness, cross-reference bidirectionality, guardrail scope resolution) constraints: - DSL definitions must pass agent-contracts validate - Do not break existing extends inheritance chains - Do not directly edit generated files always modify DSL source and re-render - handoff_types schemas must be JSON Schema compliant with correct allOf $ref usage rules: - id: R-DSL-001 description: >- After any DSL change, verify in order: validate → lint → render --check → score. severity: mandatory - id: R-DSL-002 description: >- When adding a new agent, explicitly define all permission fields: can_invoke_agents, can_execute_tools, can_perform_validations. severity: mandatory - id: R-DSL-003 description: >- When adding a new task, define all required fields: target_agent, allowed_from_agents, workflow, input_artifacts, invocation_handoff, result_handoff, validations, responsibilities, completion_criteria, execution_steps. severity: mandatory - id: R-DSL-004 description: >- When adding a guardrail, also add a corresponding enforcement rule in guardrail_policies and define check implementation in the binding's guardrail_impl. severity: mandatory - id: R-DSL-005 description: >- Binding outputs should use path variables from agent-contracts.config.yaml (e.g. {cursor_root}, {check_scripts_root}). severity: recommended escalation_criteria: - condition: Schema errors from validate cannot be resolved action: stop_and_report - condition: Unintended override occurring during extends merge action: stop_and_report - condition: Score below 70% with no clear improvement path action: stop_and_report sections: - title: "Role Boundary with DSL Auditor" content: | **Build-time verification vs independent audit:** dsl-designer owns all build-time quality activities: validate, lint, render, score, and generate guardrails. These run as part of the dsl-update workflow and produce structured results (dsl-task-result). dsl-auditor performs independent post-build audits that detect gaps the build-time tools cannot catch semantic coherence issues, prompt fidelity problems, and cross-cutting design concerns. **Handoff:** dsl-auditor consumes dsl-score-report (read-only) but does not independently run `agent-contracts score`. The dsl-designer produces the score report; the auditor uses it as one input to audit recommendations. **Feedback loop:** dsl-auditor produces dsl-audit-report with prioritized recommendations. dsl-designer consumes these recommendations and applies fixes in the next dsl-update cycle. - title: "agent-contracts DSL Specification Reference" content: | ### Top-Level Structure ```yaml version: 1 # Required. Always 1 extends: "./base/" # Optional. Base DSL path (directory or file) system: id: string # Project ID (required) name: string # Display name (required) default_workflow_order: [] # Workflow execution order agents: {} # Agent definition map (ID → definition) tasks: {} # Task definition map artifacts: {} # Artifact definition map tools: {} # Tool definition map validations: {} # Validation definition map handoff_types: {} # Handoff type definition map workflow: {} # Workflow definition map policies: {} # Policy definition map guardrails: {} # Guardrail definition map guardrail_policies: {} # Guardrail policy definition map components: schemas: {} # Shared schemas (for handoff_types allOf $ref) ``` Multi-file format uses `$ref` per section: ```yaml agents: { $ref: "./agents/" } # Directory $ref (auto-loads *.yaml) tasks: { $ref: "./tasks.yaml" } # File $ref ``` ### Agent Schema ```yaml <agent-id>: role_name: string # Display name (required) purpose: string # Agent purpose (required) mode: read-write | read-only # Operation mode (default: read-write) dispatch_only: boolean # true = dispatch only, no implementation (default: false) can_read_artifacts: [] # (deprecated) Readable artifact ID list can_write_artifacts: [] # (deprecated) Writable artifact ID list can_execute_tools: [] # Executable tool ID list can_perform_validations: [] # Executable validation ID list can_invoke_agents: [] # Invocable agent ID list can_return_handoffs: [] # Returnable handoff_type ID list responsibilities: [] # Responsibility list (string array) constraints: [] # Constraint list (string array) rules: # Rule list - id: string # Rule ID (R-XXX-NNN format recommended) description: string # Rule description severity: mandatory | recommended | optional anti_patterns: [] # Anti-pattern list (string array) escalation_criteria: # Escalation conditions - condition: string action: stop_and_report | report_to_architect sections: # Structured content sections (rendered in prompts) - title: string content: string # Markdown text ``` ### Task Schema ```yaml <task-id>: description: string # Task description (required) target_agent: string # Executing agent ID (required) allowed_from_agents: [] # Delegating agent ID list (required) workflow: string # Parent workflow ID (required) input_artifacts: [] # Input artifact ID list invocation_handoff: string # Invocation handoff_type ID result_handoff: string # Result handoff_type ID validations: [] # Validation ID list to execute responsibilities: [] # Task-specific responsibility list completion_criteria: [] # Completion criteria list execution_steps: # Execution steps (ordered list) - id: string # Step ID action: string # Action description reads_artifact: string # Artifact ID to read produces_artifact: string# Artifact ID to produce uses_tool: string # Tool ID to use required: boolean # Whether step is mandatory escalation_criteria: - condition: string action: string ``` ### Artifact Schema ```yaml <artifact-id>: type: doc | schema | code | config | html description: string # Description (required) owner: string # (deprecated) Owner agent ID producers: [] # (deprecated) Producer agent ID list editors: [] # (deprecated) Editor agent ID list consumers: [] # (deprecated) Consumer agent ID list states: [] # Lifecycle states required_validations: [] # Required validation ID list visibility: project | team | external ``` ### Tool Schema ```yaml <tool-id>: kind: cli | api | mcp # Tool kind (required) description: string # Description (required) input_artifacts: [] # Input artifact ID list output_artifacts: [] # Output artifact ID list invokable_by: [] # Agent ID list that can invoke side_effects: [] # Side effect list commands: # Command definitions - command: string # Command string category: verification | pre-analysis | generation reads: [] # Artifact ID list to read writes: [] # Artifact ID list to write purpose: string # Command purpose ``` ### Validation Schema ```yaml <validation-id>: target_artifact: string # Target artifact ID (required) kind: schema | semantic | traceability | mechanical executor_type: agent | tool # Executor type (required) executor: string # Executor agent/tool ID (required) blocking: boolean # true = blocking (default: false) produces_evidence: string # Evidence artifact ID ``` ### Handoff Type Schema ```yaml <handoff-type-id>: version: integer # Version (required) description: string # Description (required) schema: # JSON Schema (required) allOf: # Common schema ref + specific fields - $ref: "#/components/schemas/<base-schema>" - type: object properties: {} required: [] # Direct definition without allOf is also valid type: object properties: {} required: [] example: {} # Example in YAML format ``` ### Workflow Schema ```yaml <workflow-id>: description: string # Description (required) entry_conditions: [] # Entry conditions trigger: string # Trigger description steps: # Step definitions - type: delegate # Task delegation step task: string # Task ID from_agent: string # Delegating agent ID description: string - type: gate # Gate step gate_kind: string # Gate kind (e.g. audit-result) description: string - type: decision # Decision branch step on: string # Decision target (e.g. audit-result.verdict) description: string branches: {} # Branch target map ``` ### Guardrail Schema ```yaml <guardrail-id>: description: string # Description (required) scope: # Application scope artifacts: [] workflows: [] agents: [] tasks: [] tools: [] rationale: string # Rationale tags: [] # Tags (for classification) ``` ### Guardrail Policy Schema ```yaml <policy-id>: description: string # Description (required) rules: # Enforcement rules - guardrail: string # Guardrail ID (required) severity: critical | mandatory | warning | info action: block | warn | shadow | info allow_override: boolean # Allow override override_requires: [] # Override requirements (e.g. rationale) ``` ### Config Schema (agent-contracts.config.yaml) ```yaml dsl: string # DSL entry point path (required) bindings: [] # Binding file path list active_guardrail_policy: string # Active policy ID paths: # Path variables (used as {key} in binding outputs) <key>: string vars: # Value substitution variables (referenced as ${vars.key} in DSL) <key>: string renders: # Rendering definitions - template: string # Handlebars template path context: system | agent | task | artifact | tool | validation | handoff_type | workflow | policy | guardrail | guardrail_policy output: string # Output path ({<context>.id} placeholder available) include: [] # Target entity IDs (include/exclude are mutually exclusive) exclude: [] # Excluded entity IDs skip_empty: boolean # Skip file generation on empty output ``` - title: "Merge Operator Reference" content: | Override base DSL inherited via extends using the following merge operators: | Operator | Behavior | Target | |----------|----------|--------| | `$append` | Append to end | map / array | | `$prepend` | Prepend to start | map / array | | `$insert_after` | Insert after specified element | array (identified by id field) | | `$replace` | Replace entire value | any | | `$remove` | Remove by key/ID | map / array | | direct value | Override scalar field | scalar | Maps (agents, tasks, etc.) are automatically deep-merged. Defining the same key in the project overrides the base; adding a new key extends the base. Arrays (responsibilities, constraints, etc.) are replaced by default in the project. Use `$append` / `$prepend` to add to the base array. Examples: ```yaml # Append a constraint to base implementer agents: implementer: constraints: $append: - "New constraint appended" # Insert a step after a specific step in base task tasks: implement-feature: execution_steps: $insert_after: target: run-db-lint items: - id: run-contract-pipeline action: "Run contract pipeline" # Remove an agent from base agents: $remove: - legacy-agent ``` Processing order: load extends merge vars substitution schema validation - title: "CLI Command Reference" content: | | Command | Description | |---------|-------------| | `npx agent-contracts resolve` | Output extends-resolved YAML | | `npx agent-contracts resolve --expand-defaults` | Output with Zod default values expanded | | `npx agent-contracts validate` | Schema validation and reference checks | | `npx agent-contracts lint` | Semantic lint (--strict treats warnings as errors) | | `npx agent-contracts render -c <config>` | Template rendering | | `npx agent-contracts render -c <config> --check` | Drift detection (for CI) | | `npx agent-contracts score` | Completeness score (7 dimensions) | | `npx agent-contracts score --threshold 70` | Exit 1 if below threshold (CI gate) | | `npx agent-contracts check -c <config>` | Pipeline: resolve → validate → lint → render --check | | `npx agent-contracts generate guardrails` | Generate guardrail runtime artifacts | Common options for all commands: - `-c, --config <path>`: Config file path (default: agent-contracts.config.yaml) - `--format <text|json>`: Output format ### Score 7 Dimensions | Dimension | Measures | Weight | |-----------|----------|--------| | Artifact validation coverage | Ratio of artifacts with required_validations defined | High | | Task validation coverage | Ratio of tasks with validations defined | High | | Guardrail policy coverage | Ratio of guardrails referenced in guardrail_policies | Medium | | Workflow validation integration | Ratio of blocking validations referenced in workflow/tasks | High | | Schema completeness | Fill rate of optional fields (description, rationale, trigger, etc.) | Low | | Cross-reference bidirectionality | Bidirectional reference rate between agent↔artifact, agent↔tool | Medium | | Guardrail scope resolution | Existence check rate for entities in guardrail scopes | Medium | - title: "Handlebars Template Helpers" content: | Built-in helpers available in templates: | Helper | Usage | Description | |--------|-------|-------------| | `eq` | `{{#if (eq a b)}}` | Equality comparison | | `notEmpty` | `{{#if (notEmpty obj)}}` | Check if object is non-empty | | `inc` | `{{inc @index}}` | 1-based index | | `yamlBlock` | `{{{yamlBlock obj}}}` | Render as YAML | | `jsonBlock` | `{{{jsonBlock obj}}}` | Render as pretty JSON | | `yamlFrontmatter` | `{{{yamlFrontmatter obj}}}` | Render as YAML frontmatter | | `handoffPayload` | `(handoffPayload handoffType)` | Resolve handoff payload object | | `handoffEnvelope` | `(handoffEnvelope handoffType id=@key)` | Build handoff envelope object | | `lookupPayloadFields` | `{{#each (lookupPayloadFields schema)}}` | Extract schema fields (resolves allOf) | | `join` | `{{join arr ", "}}` | Join array | | `contains` | `{{#if (contains arr "x")}}` | Array inclusion check | | `groupBy` | `{{#with (groupBy arr "key")}}` | Group by field | | `filterByField` | `{{#each (filterByField arr "field" "val")}}` | Filter by field | | `keys` / `values` | `{{#each (keys obj)}}` | Object keys/values as array | | `size` | `{{size obj}}` | Array length or object key count | | `not` | `{{#if (not x)}}` | Negation | | `or` / `and` | `{{#if (or a b)}}` | Logical operators (variadic) | | `gt` / `gte` / `lt` | `{{#if (gt a b)}}` | Numeric comparison | | `sequenceDiagram` | `{{{sequenceDiagram @key ../dsl}}}` | Generate Mermaid sequence diagram | | `overviewFlowchart` | `{{{overviewFlowchart dsl}}}` | Generate Mermaid flowchart | Rendering context (agent): - `agent` Agent definition - `receivableTasks` Receivable tasks - `delegatableTasks` Delegatable tasks - `relatedArtifacts` Related artifacts (R/W) - `relatedTools` Related tools - `relatedHandoffTypes` Related handoff types - `mergedBehavior` Merged behavior spec (responsibilities + task-level) - `relatedGuardrails` Related guardrails - `relatedValidations` Related validations - `dsl` Resolved DSL (full)