From 0e2d213c39492aede85c787a26e4da2af9ebc731 Mon Sep 17 00:00:00 2001 From: Jon Chery Date: Wed, 29 Jul 2026 15:06:00 +0000 Subject: [PATCH] =?UTF-8?q?verify(P##):=20code=20review=20=E2=80=94=20conf?= =?UTF-8?q?ig.json=20schema=20migration=20(0=20P0,=202=20P1/P2=20auto-fixe?= =?UTF-8?q?d)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Regenerate .ciagent/config.json to the updated CIAgent schema: - Drop removed fields (mode, projects[].milestone/status/branch/tag) - Migrate top-level gitea -> release.gitea (forge: gitea) - Add new sections: secrets, release, ship, backend, ideation, personas, logging, telemetry, active_projects, security.bash_allowlist - Preserve autonomy/parallelization/verification/git/sessions values - Preserve custom gitea token env var (ACDL_GITEA_TOKEN) via secrets.scopes Review findings auto-fixed: - P1: add .ciagent/logs/ to .gitignore (runtime log artifact hygiene) - P2: restore trailing newline in config.json ---ci--- project: acdl phase: 0 milestone: v1.13 status: verify lessons: - P1: .ciagent/logs/ default logging.file target was untracked — gitignore it - P2: config.json lost trailing newline during regeneration — restored ---/ci--- --- .ciagent/config.json | 176 +++++++++++++++++++++++++++++++++++++++---- .gitignore | 3 + 2 files changed, 166 insertions(+), 13 deletions(-) diff --git a/.ciagent/config.json b/.ciagent/config.json index ae808ec..26d1725 100644 --- a/.ciagent/config.json +++ b/.ciagent/config.json @@ -1,17 +1,13 @@ { - "mode": "single", "projects": [ { "slug": "acdl", "name": "Agentic Cloud Delivery Platform", - "milestone": "v1.13", - "status": "complete", - "milestone_branch": "milestone/v1.13-deck-polish", - "milestone_base": "v1.12.0", - "ship_tag": "v1.13.0" + "default": true } ], "active_project": "acdl", + "active_projects": ["acdl"], "autonomy": { "level": "full", "escalation_hooks": ["deploy", "delete_data", "merge_to_main"], @@ -37,22 +33,176 @@ "security": { "auto_accept_low_severity": true, "auto_mitigate_medium_severity": true, - "escalate_high_severity": true + "escalate_high_severity": true, + "bash_allowlist": { + "allowed_commands": [ + "npm", "node", "npx", "pnpm", "yarn", + "git", "ls", "cat", "head", "tail", "wc", + "echo", "mkdir", "cp", "mv", "rm", "touch", + "pwd", "which", "env", "printenv", + "jest", "eslint", "tsc", "prettier", + "curl", "wget", + "docker", "docker-compose", + "ts-node", "tsx" + ], + "max_output_bytes": 1048576, + "timeout_ms": 30000, + "blocked_env_vars": [ + "HOME", "PATH", "USER", "SHELL", + "AWS_*", "*_TOKEN", "*_KEY", "*_SECRET", + "*_PASSWORD", "*_CREDENTIAL", + "GITHUB_TOKEN", "GITHUB_API_KEY", + "OPENAI_API_KEY", "ANTHROPIC_API_KEY", + "OLLAMA_CLOUD_API_KEY" + ] + } }, "git": { "branching_strategy": "phase", "auto_commit": true, "auto_push": true }, + "secrets": { + "sources": [".env", ".env.secrets", ".env.*"], + "disallow": ["shell_env", "netrc", "keychain", "rc_files", "global_config"], + "scopes": { + "gitea": "ACDL_GITEA_TOKEN", + "github": "GITHUB_TOKEN", + "gitlab": "GITLAB_TOKEN", + "openai": "OPENAI_API_KEY", + "anthropic": "ANTHROPIC_API_KEY", + "ollama_cloud": "OLLAMA_CLOUD_API_KEY" + } + }, + "release": { + "forge": "gitea", + "gitea": { + "base_url": "https://git.cloudinit.dev", + "owner": "continuous-intelligence", + "repo": "acdl", + "token_scope": "gitea" + }, + "github": { + "owner": "", + "repo": "", + "token_scope": "github" + }, + "gitlab": { + "base_url": "", + "owner": "", + "repo": "", + "token_scope": "gitlab" + } + }, + "ship": { + "per_phase": true, + "require_release": true, + "allow_skip": false, + "confirm_before_ship": false, + "max_release_retries": 3, + "release_blocking": false + }, + "backend": { + "provider": "auto", + "agent_backends": { + "opencode": { "enabled": true }, + "codex": { "enabled": true }, + "claude-code": { "enabled": true }, + "hermes": { "enabled": true } + }, + "llm_backends": { + "openai": { + "base_url": "https://api.openai.com/v1", + "api_key_env": "OPENAI_API_KEY", + "model": "gpt-4o", + "model_profile": "quality", + "timeout_ms": 60000 + }, + "ollama-local": { + "base_url": "http://localhost:11434", + "model_profile": "balanced" + }, + "ollama-cloud": { + "base_url": "", + "api_key_env": "OLLAMA_CLOUD_API_KEY", + "model_profile": "quality", + "timeout_ms": 60000 + }, + "anthropic": { + "base_url": "https://api.anthropic.com", + "api_key_env": "ANTHROPIC_API_KEY", + "model": "claude-sonnet-4-20250514", + "api_version": "2023-06-01", + "model_profile": "quality", + "timeout_ms": 60000 + } + } + }, + "ideation": { + "enabled": true, + "categories": ["security", "quality", "architecture", "coverage", "improvement"], + "confidence_threshold": 0.6, + "max_ideas": 20, + "external_signals": { + "npm_audit": true, + "osv_advisories": true, + "dependency_staleness": true + }, + "cross_project": { + "enabled": false, + "similarity_weight": 0.5 + }, + "chaos": { + "enabled": true, + "scenarios": ["backend_unavailable", "requirement_change", "test_coverage_drop"] + } + }, "sessions": { "max_concurrent_sessions": 3, "session_timeout_ms": 3600000, "session_isolation": "branch" }, - "gitea": { - "base_url": "https://git.cloudinit.dev", - "api_token_env": "ACDL_GITEA_TOKEN", - "owner": "continuous-intelligence", - "repo": "acdl" + "personas": { + "enabled": true, + "territory_enforcement": "warn", + "personas": [ + { + "name": "lead-developer", + "domain": "coordination", + "frameworks": [], + "constraints": ["pragmatic", "battle-tested defaults"], + "territory": [] + }, + { + "name": "data-engineer", + "domain": "data", + "frameworks": ["drizzle", "postgresql"], + "constraints": ["schema-first", "type-safe ORM", "migration-driven"], + "territory": ["**/migrations/**", "**/schema/**", "**/models/**", "**/db/**", "prisma/schema.prisma", "drizzle/**", "**/*.sql"] + }, + { + "name": "backend-engineer", + "domain": "backend", + "frameworks": ["fastify", "hono"], + "constraints": ["api-first", "strict-typing", "dependency-injection"], + "territory": ["**/api/**", "**/routes/**", "**/services/**", "**/middleware/**", "**/controllers/**", "**/auth/**"] + }, + { + "name": "frontend-engineer", + "domain": "frontend", + "frameworks": ["react", "next.js"], + "constraints": ["component-first", "server-components", "minimal-client-js"], + "territory": ["**/components/**", "**/pages/**", "**/hooks/**", "**/styles/**", "**/*.tsx", "**/*.css", "**/*.vue"] + } + ] + }, + "logging": { + "level": "info", + "format": "json", + "file": ".ciagent/logs/ciagent.jsonl" + }, + "telemetry": { + "enabled": true, + "persist": true } -} \ No newline at end of file +} diff --git a/.gitignore b/.gitignore index 599cfef..8b0f26a 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,9 @@ runner-data/ .env.secrets terraform/bootstrap/.bootstrap_state.json +# CIAgent runtime artifacts +.ciagent/logs/ + # Terraform — recursively ignore .terraform dirs, lock files, plans, and state **/.terraform/ **/.terraform.lock.hcl