From 23234b96caf32e167297206c972aebbc75af8135 Mon Sep 17 00:00:00 2001 From: Hare Date: Sat, 18 Jul 2026 21:59:58 +0900 Subject: [PATCH] profile: inherit ticket tools across roles --- crates/manifest/src/profile.rs | 28 ++++++++++++---------------- resources/profiles/coder.dcdl | 1 - resources/profiles/companion.dcdl | 1 - resources/profiles/intake.dcdl | 1 - resources/profiles/orchestrator.dcdl | 1 - resources/profiles/reviewer.dcdl | 1 - 6 files changed, 12 insertions(+), 21 deletions(-) diff --git a/crates/manifest/src/profile.rs b/crates/manifest/src/profile.rs index d4c0f3b6..bd2adb68 100644 --- a/crates/manifest/src/profile.rs +++ b/crates/manifest/src/profile.rs @@ -895,7 +895,6 @@ fn builtin_profile_artifact(label: &str) -> Option { true, true, false, - false, ); Some(value) } @@ -909,7 +908,6 @@ fn builtin_profile_artifact(label: &str) -> Option { true, true, false, - true, false, ); Some(value) @@ -925,7 +923,6 @@ fn builtin_profile_artifact(label: &str) -> Option { true, true, true, - true, ); Some(value) } @@ -940,7 +937,6 @@ fn builtin_profile_artifact(label: &str) -> Option { true, false, false, - false, ); Some(value) } @@ -955,7 +951,6 @@ fn builtin_profile_artifact(label: &str) -> Option { true, false, false, - false, ); Some(value) } @@ -1009,19 +1004,16 @@ fn apply_role_profile( memory: bool, web: bool, workers: bool, - ticket: bool, ticket_orchestration: bool, ) { value["slug"] = serde_json::Value::String(slug.to_string()); value["description"] = serde_json::Value::String(description.to_string()); - value["feature"] = serde_json::json!({ - "task": { "enabled": task }, - "memory": { "enabled": memory }, - "web": { "enabled": web }, - "workers": { "enabled": workers }, - "ticket": { "enabled": ticket, "access": "lifecycle" }, - "ticket_orchestration": { "enabled": ticket_orchestration } - }); + value["feature"]["task"] = serde_json::json!({ "enabled": task }); + value["feature"]["memory"] = serde_json::json!({ "enabled": memory }); + value["feature"]["web"] = serde_json::json!({ "enabled": web }); + value["feature"]["workers"] = serde_json::json!({ "enabled": workers }); + value["feature"]["ticket_orchestration"] = + serde_json::json!({ "enabled": ticket_orchestration }); } fn reject_manifest_shaped_profile(value: &serde_json::Value) -> Result<(), ProfileError> { @@ -1441,12 +1433,13 @@ mod tests { let companion = resolve("companion"); assert!(companion.feature.task.enabled); assert!(companion.feature.workers.enabled); - assert!(!companion.feature.ticket.enabled); assert!(companion.scope.allow.is_empty()); assert!(companion.scope.deny.is_empty()); assert!(companion.delegation_scope.allow.is_empty()); assert_eq!(companion.model.ref_.as_deref(), Some("codex-oauth/gpt-5.5")); assert!(companion.web.is_some()); + assert!(companion.feature.ticket.enabled); + assert!(!companion.feature.ticket_orchestration.enabled); assert_eq!( companion.compaction.as_ref().unwrap().threshold, Some(240000) @@ -1497,11 +1490,14 @@ mod tests { assert_eq!(coder.model.ref_.as_deref(), Some("codex-oauth/gpt-5.5")); assert!(coder.web.is_some()); assert!(coder.compaction.is_some()); + assert!(coder.feature.ticket.enabled); + assert!(!coder.feature.ticket_orchestration.enabled); let reviewer = resolve("reviewer"); assert!(reviewer.feature.task.enabled); assert!(!reviewer.feature.workers.enabled); - assert!(!reviewer.feature.ticket.enabled); + assert!(reviewer.feature.ticket.enabled); + assert!(!reviewer.feature.ticket_orchestration.enabled); assert!(reviewer.scope.allow.is_empty()); assert!(reviewer.delegation_scope.allow.is_empty()); assert_eq!(reviewer.model.ref_.as_deref(), Some("codex-oauth/gpt-5.5")); diff --git a/resources/profiles/coder.dcdl b/resources/profiles/coder.dcdl index c59288ec..ea53295d 100644 --- a/resources/profiles/coder.dcdl +++ b/resources/profiles/coder.dcdl @@ -8,7 +8,6 @@ import "./default.dcdl" // { memory = { enabled = true; }; web = { enabled = true; }; workers = { enabled = false; }; - ticket = { enabled = false; access = "lifecycle"; }; ticket_orchestration = { enabled = false; }; }; } diff --git a/resources/profiles/companion.dcdl b/resources/profiles/companion.dcdl index 2b0b6623..2c1c3851 100644 --- a/resources/profiles/companion.dcdl +++ b/resources/profiles/companion.dcdl @@ -8,7 +8,6 @@ import "./default.dcdl" // { memory = { enabled = true; }; web = { enabled = true; }; workers = { enabled = true; }; - ticket = { enabled = false; access = "lifecycle"; }; ticket_orchestration = { enabled = false; }; }; } diff --git a/resources/profiles/intake.dcdl b/resources/profiles/intake.dcdl index e4c7a799..91e98b5e 100644 --- a/resources/profiles/intake.dcdl +++ b/resources/profiles/intake.dcdl @@ -8,7 +8,6 @@ import "./default.dcdl" // { memory = { enabled = true; }; web = { enabled = true; }; workers = { enabled = false; }; - ticket = { enabled = true; access = "lifecycle"; }; ticket_orchestration = { enabled = false; }; }; } diff --git a/resources/profiles/orchestrator.dcdl b/resources/profiles/orchestrator.dcdl index c40224eb..a502b999 100644 --- a/resources/profiles/orchestrator.dcdl +++ b/resources/profiles/orchestrator.dcdl @@ -8,7 +8,6 @@ import "./default.dcdl" // { memory = { enabled = true; }; web = { enabled = true; }; workers = { enabled = true; }; - ticket = { enabled = true; access = "lifecycle"; }; ticket_orchestration = { enabled = true; }; }; } diff --git a/resources/profiles/reviewer.dcdl b/resources/profiles/reviewer.dcdl index 732fb2a0..9f714f86 100644 --- a/resources/profiles/reviewer.dcdl +++ b/resources/profiles/reviewer.dcdl @@ -8,7 +8,6 @@ import "./default.dcdl" // { memory = { enabled = true; }; web = { enabled = true; }; workers = { enabled = false; }; - ticket = { enabled = false; access = "lifecycle"; }; ticket_orchestration = { enabled = false; }; }; }