e8a05adcd1
- TASK-05-01 scripts/create-operator.py: CLI that reads PRAXIS_BOOTSTRAP_OPERATOR_USER/PASS + PRAXIS_PG_DSN from env, creates the pool, applies migrations, hashes the password with argon2id, and INSERTs with ON CONFLICT DO NOTHING (idempotent — D-052). --update flag forces rehash + ON CONFLICT DO UPDATE. Missing env → exit 1 (R-BOOT-02). Connection failure → 3x retry with 5s backoff (R-BOOT-01). - TASK-05-02 .ciagent/config.json: added "operator" secrets scope (PRAXIS_PG_PASSWORD, PRAXIS_COOKIE_SECRET, PRAXIS_BOOTSTRAP_OPERATOR_USER/PASS, PRAXIS_VC_ISSUER_KEY). .ciagent/.env.secrets.example: template (committed, no real secrets). .gitignore: added negations so .env.secrets.example is tracked while .env.secrets stays ignored. - TASK-05-03 tests/test_create_operator.py: 7 tests (mocked PgStore) — create, already-exists (no update), --update rehashes, missing env → exit 1, password is argon2id (not plaintext). ---ci--- project: praxis phase: 1 milestone: v0.4 status: execute persona: devops-engineer task: 05-01,05-02,05-03 requirements: covered: [REQ-AUTH-01] ---/ci---
114 lines
3.0 KiB
JSON
114 lines
3.0 KiB
JSON
{
|
|
"projects": [
|
|
{
|
|
"slug": "praxis",
|
|
"name": "Praxis",
|
|
"milestone": "v0.4",
|
|
"status": "active"
|
|
}
|
|
],
|
|
"active_project": "praxis",
|
|
"active_projects": ["praxis"],
|
|
"autonomy": {
|
|
"level": "full",
|
|
"escalation_hooks": ["deploy", "delete_data", "merge_to_main"],
|
|
"clarify_budget": 10,
|
|
"decision_confidence_threshold": 0.6,
|
|
"max_revision_iterations": 3,
|
|
"max_verification_retries": 2,
|
|
"escalation_timeout_ms": 300000
|
|
},
|
|
"model_profile": "quality",
|
|
"parallelization": {
|
|
"enabled": true,
|
|
"max_concurrent_agents": 5,
|
|
"min_plans_for_parallel": 2,
|
|
"max_concurrent_projects": 3
|
|
},
|
|
"verification": {
|
|
"automated_only": true,
|
|
"escalate_visual": true,
|
|
"escalate_external_integration": true,
|
|
"test_first": false
|
|
},
|
|
"security": {
|
|
"auto_accept_low_severity": true,
|
|
"auto_mitigate_medium_severity": true,
|
|
"escalate_high_severity": true
|
|
},
|
|
"git": {
|
|
"branching_strategy": "phase",
|
|
"auto_commit": true,
|
|
"auto_push": false
|
|
},
|
|
"sessions": {
|
|
"max_concurrent_sessions": 3,
|
|
"session_timeout_ms": 3600000,
|
|
"session_isolation": "branch"
|
|
},
|
|
"personas": {
|
|
"enabled": true,
|
|
"territory_enforcement": "warn",
|
|
"personas": [
|
|
{
|
|
"name": "lead-developer",
|
|
"domain": "coordination",
|
|
"frameworks": [],
|
|
"constraints": ["pragmatic", "battle-tested defaults"],
|
|
"territory": []
|
|
},
|
|
{
|
|
"name": "backend-engineer",
|
|
"domain": "backend",
|
|
"frameworks": [],
|
|
"constraints": ["api-first", "type-safe", "latency-budget-aware"],
|
|
"territory": ["**/server/**", "**/api/**", "**/services/**"]
|
|
},
|
|
{
|
|
"name": "frontend-engineer",
|
|
"domain": "frontend",
|
|
"frameworks": [],
|
|
"constraints": ["component-first", "voice-first-ui"],
|
|
"territory": ["**/client/**", "**/ui/**", "**/components/**"]
|
|
},
|
|
{
|
|
"name": "data-engineer",
|
|
"domain": "data",
|
|
"frameworks": [],
|
|
"constraints": ["schema-first", "type-safe", "migration-driven"],
|
|
"territory": ["**/migrations/**", "**/schema/**", "**/models/**", "**/db/**"]
|
|
}
|
|
]
|
|
},
|
|
"release": {
|
|
"forge": "gitea",
|
|
"base_url": "https://git.cloudinit.dev",
|
|
"owner": "coreci",
|
|
"repo": "praxis"
|
|
},
|
|
"secrets": {
|
|
"scopes": [
|
|
{
|
|
"name": "release",
|
|
"env_vars": ["GITEA_TOKEN"]
|
|
},
|
|
{
|
|
"name": "proxmox",
|
|
"env_vars": ["PROXMOX_API_URL", "PROXMOX_API_TOKEN", "PROXMOX_NODE", "PROXMOX_STORAGE", "PROXMOX_TEMPLATE_VOLID", "PROXMOX_TLS_SKIP_VERIFY"]
|
|
},
|
|
{
|
|
"name": "voice",
|
|
"env_vars": ["DEEPGRAM_API_KEY", "CARTESIA_API_KEY", "OLLAMA_API_KEY"]
|
|
},
|
|
{
|
|
"name": "operator",
|
|
"env_vars": ["PRAXIS_PG_PASSWORD", "PRAXIS_COOKIE_SECRET", "PRAXIS_BOOTSTRAP_OPERATOR_USER", "PRAXIS_BOOTSTRAP_OPERATOR_PASS", "PRAXIS_VC_ISSUER_KEY"]
|
|
}
|
|
]
|
|
},
|
|
"ship": {
|
|
"per_phase": true,
|
|
"allow_skip": false,
|
|
"max_release_retries": 3
|
|
}
|
|
} |