diff --git a/.spec/CollaborationProtocol/ignition-prompts.md b/.spec/CollaborationProtocol/ignition-prompts.md index 0bff613..0f4d10e 100644 --- a/.spec/CollaborationProtocol/ignition-prompts.md +++ b/.spec/CollaborationProtocol/ignition-prompts.md @@ -51,8 +51,8 @@ You are part of a multi-agent team. Follow these rules: **Hierarchy** - You report to: {parent_agent} (or boss if no parent) - Send status updates to your manager via message when significant progress happens -- Message your manager directly when blocked; message the boss agent channel for boss-level decisions -- Escalate to boss only after manager unresponsive for 30+ minutes +- Message your manager when blocked; set the task to `blocked` status +- Escalate up the chain if your manager is unresponsive **Your Role** - Your role is defined by the agent that spawned you — check your ignition message for specifics @@ -72,7 +72,7 @@ You → {parent} → {grandparent} → boss Peers (same manager): {peer1}, {peer2} Your team (if manager): {child1}, {child2} -Note: The org structure may change as work evolves. Check your messages for hierarchy updates. +Note: Your position in the team is set by whoever spawned you. Check your ignition message for specifics. ``` ### Section: Work Loop diff --git a/.spec/CollaborationProtocol/messaging-protocol.md b/.spec/CollaborationProtocol/messaging-protocol.md index 8511e42..fb1424f 100644 --- a/.spec/CollaborationProtocol/messaging-protocol.md +++ b/.spec/CollaborationProtocol/messaging-protocol.md @@ -63,8 +63,8 @@ the Escalation section below. ### 4. Peer-to-Peer Coordination -Agents may message any peer directly — no manager authorization is required. Peer communication -is the default; a manager can explicitly forbid a specific interaction if needed. +Agents may message any peer directly — no authorization required. Direct peer messaging is always +allowed. ``` DevA sends message to DevB: @@ -76,10 +76,11 @@ update so the manager has visibility. ### 5. Escalation -If work is blocked and the manager is unresponsive for >30 minutes: +If work is blocked and the manager is unresponsive after multiple check cycles, escalate up the +chain — message the manager's manager (or the operator if no higher level exists): ``` -Agent sends message to boss: - "ESCALATION: TASK-{id} blocked on {blocker}. Manager {ManagerName} unresponsive for 30+ min." +Agent sends message to {ManagersManager}: + "TASK-{id} blocked on {blocker}. {ManagerName} has not responded. Requesting escalation." ``` ## Message Discipline diff --git a/.spec/CollaborationProtocol/organizational-model.md b/.spec/CollaborationProtocol/organizational-model.md index 638ecda..030bca1 100644 --- a/.spec/CollaborationProtocol/organizational-model.md +++ b/.spec/CollaborationProtocol/organizational-model.md @@ -115,7 +115,7 @@ Every task must have: an assignee, a parent (or be a root task), and a status th - Agents report status up (via messages and status updates) - Managers send decisions down (via task assignment and messages) -- Peers coordinate laterally (via direct messages — allowed by default; manager can restrict specific interactions as an exception) +- Peers coordinate laterally (via direct messages — always allowed, no authorization required) ### 5. Context at the edge diff --git a/.spec/CollaborationProtocol/team-formation.md b/.spec/CollaborationProtocol/team-formation.md index fa49245..97e4e88 100644 --- a/.spec/CollaborationProtocol/team-formation.md +++ b/.spec/CollaborationProtocol/team-formation.md @@ -18,10 +18,12 @@ meets **any** of these criteria: - Has more than one acceptance criterion - Is a planning, spec, or design task (always non-trivial) - Would benefit from an independent review pass -- Estimated effort exceeds ~30 minutes of focused work +- Could benefit from a second perspective or independent review +- Requires more than one focused action to complete (e.g. research then implement, or implement then test) -Solo work is appropriate only for tightly scoped leaf tasks: a single bug fix, a one-file -documentation update, or a clearly-specified implementation with no design decisions. +Solo work is appropriate only for atomic leaf tasks: a single, completely specified change with +no decisions to make and no more than one deliverable. When in doubt, form a team — the cost of +an extra agent is far lower than the cost of a solo agent going off in the wrong direction. ## Required Team Roles diff --git a/docs/AGENT_PROTOCOL.md b/docs/AGENT_PROTOCOL.md index b0330f7..94d09d1 100644 --- a/docs/AGENT_PROTOCOL.md +++ b/docs/AGENT_PROTOCOL.md @@ -136,7 +136,7 @@ X-Agent-Name: {agent} } ], "next_steps": "open PR after tests pass", - "questions": ["[?BOSS] should we use approach X or Y?"], + "questions": ["should we use approach X or Y?"], "blockers": ["waiting for DataMgr to merge PR #7"], "parent": "ManagerAgent", "role": "Developer", @@ -158,7 +158,7 @@ X-Agent-Name: {agent} | `items` | array | no | Bullet points shown in dashboard | | `sections` | array | no | Titled sub-sections with item lists | | `next_steps` | string | no | What you will do next | -| `questions` | array | no | Auto-tagged `[?BOSS]` in dashboard | +| `questions` | array | no | Questions surfaced in the dashboard for the human operator | | `blockers` | array | no | Highlighted in dashboard | | `parent` | string | no | Manager agent name — sticky hierarchy link | | `role` | string | no | Display label e.g. `"Developer"`, `"SME"` | @@ -568,7 +568,7 @@ X-Agent-Boss-Agent: {agent} 4. GET /agent/{agent}/events → open SSE stream (blocking) ↕ (in parallel) 5. Do work -6. POST /agent/{agent} → status update every ~10 minutes +6. POST /agent/{agent} → status update at meaningful milestones 7. On SSE message event → act immediately 8. POST /agent/{agent} → status: done when finished ``` @@ -691,7 +691,7 @@ Non-tmux agents (Docker, CI, remote, script) interact with the coordinator exact 1. **Register** with `agent_type` set to your runtime (`"http"`, `"docker"`, `"script"`, etc.) 2. **Set `heartbeat_interval_sec`** if you want staleness detection (recommended: 60) -3. **Post status updates** at least every 10 minutes during active work +3. **Post status updates** at meaningful milestones (task complete, blocker hit, PR opened, etc.) 4. **Send heartbeats** at your registered interval 5. **Subscribe to SSE** or poll `/messages` for incoming instructions 6. **Post `"status": "done"`** when finished diff --git a/frontend/src/components/TaskDetailPanel.vue b/frontend/src/components/TaskDetailPanel.vue index d7316c8..bfb8167 100644 --- a/frontend/src/components/TaskDetailPanel.vue +++ b/frontend/src/components/TaskDetailPanel.vue @@ -86,13 +86,21 @@ const subtaskItems = computed(() => { }) function buildPrUrl(pr: string): string | null { - if (pr.startsWith('http')) return pr + // Already a full URL + if (/^https?:\/\//.test(pr)) return pr + // URL missing protocol (e.g. github.com/org/repo/pull/42) + if (/^(github\.com|gitlab\.com)\//.test(pr)) return 'https://' + pr + + // Extract a bare PR number from formats like #42, PR #42, PR-42, 42 + const numMatch = pr.match(/(\d+)$|#(\d+)/) + const num = numMatch ? (numMatch[1] ?? numMatch[2]) : null + if (!num) return null + // Try to build URL from the assigned agent's repo_url if (props.task?.assigned_to) { const agent = props.space.agents[props.task.assigned_to] if (agent?.repo_url) { const base = agent.repo_url.replace(/\.git$/, '').replace(/\/$/, '') - const num = pr.replace(/^#/, '') return `${base}/pull/${num}` } } @@ -100,7 +108,6 @@ function buildPrUrl(pr: string): string | null { for (const agent of Object.values(props.space.agents ?? {})) { if (agent.repo_url) { const base = agent.repo_url.replace(/\.git$/, '').replace(/\/$/, '') - const num = pr.replace(/^#/, '') return `${base}/pull/${num}` } } @@ -217,7 +224,7 @@ async function setDueDate(value: string) {