feat(phase6c+phase3b): LLM router, activity SSE, context pack v2, evidence panel#28
Merged
Merged
Conversation
…dpoint Add suggest-only role recommendation flow: SuggestRoleFromContext uses prompt templates in prompts/meta/ to call the configured LLM and returns a suggested role + rationale without auto-applying. Operator must confirm before any catalog write. CandidateRoleEditor gains a "Suggest role" button that surfaces the recommendation inline. DECISIONS.md updated; entries before 2026-04-22 archived to DECISIONS_ARCHIVE.md. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add ActivityHub (SSE fan-out) + ActivityReporter so local connectors can stream real-time phase/step updates. GET /api/me/local-connectors/:id/activity-stream serves the SSE channel; GET /activity returns the latest snapshot. Frontend: useConnectorActivity hook (SSE-primary, 15 s poll fallback, 90 s stale detection) + ConnectorActivityBadge (compact/standard/full variants). Badge shown inline on active planning runs in PlanningRunList. Dogfood checklist added in docs/phase6c-dogfood-notes.md; operating-rules and rules-quickstart updated with activity-SSE and advisory-router constraints. CI workflow and Makefile gain affected-test helpers. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…+ quality view PR-1 — PlanningContextV2 wire struct (schema_version, pack_id, role, intent_mode, task_scale, source_of_truth[]) + scale.EstimateTaskScale heuristic (word-count + keyword overrides). Migrations 032/033 add planning_context_snapshots table and context_pack_id column on planning_runs. ContextSnapshotStore Save/GetByRunID. PR-2 — GET /api/planning-runs/:id/context-snapshot returns structured evidence (sources, counts, role, intent_mode, task_scale). Snapshot saved fire-and-forget in ClaimNextRun where V1 context is built; Orchestrator gets SnapshotSaver interface as hook for future server-provider path. PR-3 — Migration 034 adds feedback_kind/feedback_note columns on backlog_candidates. Optional feedback popover in CandidateReviewPanel (skippable, never blocks approve/reject). QualitySummary computed in PlanningRunStore.GetByID; quality row shown in PlanningRunList once all candidates are reviewed. PR-4 — DashboardSummary gains avg_planning_acceptance_rate and planning_runs_reviewed_count (7-day window, CASE WHEN for SQLite+Postgres compat). ProjectOverviewTab shows acceptance rate inline. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Phase 3A spike findings (docs/phase3a-spike-findings.md): - Connector route viable for CLI tools (Claude, Codex, OpenCode); not viable for Copilot/ChatGPT (no CLI automation surface — use server_provider). - Critical gap identified: Phase 3B backend had GET /context-snapshot but zero frontend; Phase 6d not ready yet (needs dogfood data). Evidence Panel frontend (Phase 3B PR-2 completion): - ContextSnapshot + ContextSnapshotSourceRef types added to types/index.ts. - getContextSnapshot(runId) added to api/client.ts. - PlanningRunContextDrawer: lazy-loaded collapsible drawer per run showing source counts, V2 envelope (role/intent/scale), byte budget, pack_id, source_of_truth files, and truncation warnings when dropped_counts > 0. - PlanningRunList wires the drawer on all completed/failed runs. Connector v2 dispatch upgrade (Gap 2): - LocalConnectorClaimNextRunResponse gains optional planning_context_v2 field. - saveContextSnapshot now returns *wire.PlanningContextV2 so ClaimNextRun can include v2 envelope in the response; connectors can read role/intent_mode/ task_scale without a second round-trip. - Backward-compatible: planning_context (v1) still present for older connectors. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Catch-up PR bundling four previously un-PR’d feature sets: advisory LLM role routing (suggest-role), connector activity SSE + badge, context-pack v2 snapshot + evidence drawer, and candidate feedback + quality summary metrics.
Changes:
- Added advisory role suggestion flow (backend
POST /backlog-candidates/:id/suggest-role+ dispatcher meta-prompt + frontend “💡 Suggest” UX). - Added connector activity telemetry (hub + persistence + SSE/polling endpoints) and surfaced it in the planning UI via
ConnectorActivityBadge. - Added context-pack v2 snapshot storage + retrieval endpoint and a frontend context drawer; added candidate feedback + run/dashboard quality summary fields.
Reviewed changes
Copilot reviewed 74 out of 74 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| scripts/test-affected.sh | Adds Go “test affected packages” helper used by fast pre-PR checks. |
| scripts/pre-pr-check.sh | Adds --fast path to run affected-only frontend/backend tests. |
| rules/global/core.md | Expands GLOBAL-001 and adds GLOBAL-010/011 scope & test-first rules. |
| rules/domain/frontend-components.md | Adds UI-007 SSE routing rule + UI-008 advisory LLM UX rule. |
| rules/domain/backend-api.md | Adds API-007 SSE payload routing fields + API-008 advisory LLM endpoint behavior. |
| go.work.sum | Adds Go workspace sum entries for x/* modules. |
| frontend/src/types/index.ts | Adds connector activity types, context snapshot types, quality summary + feedback fields, dashboard metrics fields. |
| frontend/src/pages/ProjectDetail/planning/hooks/usePlanningWorkspaceData.ts | Adds planning-run SSE-driven refresh + role suggestion + feedback submission callbacks. |
| frontend/src/pages/ProjectDetail/planning/PlanningRunList.tsx | Shows connector activity badge, quality summary row, and context drawer toggle per run. |
| frontend/src/pages/ProjectDetail/planning/PlanningRunContextDrawer.tsx | New lazy-loaded evidence/context snapshot drawer UI. |
| frontend/src/pages/ProjectDetail/planning/CandidateRoleEditor.tsx | Adds “💡 Suggest” role UX + displays dispatcher reasoning/alternatives. |
| frontend/src/pages/ProjectDetail/planning/CandidateReviewPanel.tsx | Adds apply-panel suggest UX, approve shortcut, optional post-decision feedback row. |
| frontend/src/pages/ProjectDetail/ProjectOverviewTab.tsx | Displays 7-day acceptance-rate summary when available. |
| frontend/src/pages/ProjectDetail/PlanningTab.tsx | Wires suggest-role + feedback submission into candidate panels. |
| frontend/src/pages/ProjectDetail.tsx | Passes acceptance-rate summary props down to overview tab. |
| frontend/src/hooks/useConnectorActivity.ts | New hook for connector activity via SSE + polling fallback. |
| frontend/src/components/ConnectorActivityBadge.tsx | New UI badge component to show connector phase/subject and stale state. |
| frontend/src/api/client.ts | Adds suggest-role, context snapshot, and connector activity API methods + URL helpers. |
| frontend/src/App.tsx | Fans out planning-run-changed SSE events onto window custom events. |
| frontend/package.json | Adds test:affected script (vitest run --changed). |
| docs/rules-quickstart.md | Updates quickstart checklist with new GLOBAL-001/010/011 reminders. |
| docs/phase6c-dogfood-notes.md | Adds Phase 6c dogfood validation checklist. |
| docs/phase3a-spike-findings.md | Adds Phase 3A connector feasibility findings doc. |
| docs/phase-3b-plan.md | Adds Phase 3B planning quality improvement plan doc. |
| docs/operating-rules.md | Updates operating rules; documents role-dispatch safety/visibility model. |
| docs/data-model.md | Updates canonical schema notes for migrations 031–034 + new tables/columns. |
| docs/api-surface.md | Documents new context-snapshot and connector-activity endpoints. |
| backend/internal/store/summary_store.go | Computes 7-day reviewed-run acceptance rate for dashboard. |
| backend/internal/store/planning_run_store.go | Persists context_pack_id; attaches run-level quality summary on GetByID. |
| backend/internal/store/local_connector_store.go | Persists and restores connector activity snapshots. |
| backend/internal/store/context_snapshot_store_test.go | Adds tests for context snapshot store + context pack ID creation. |
| backend/internal/store/context_snapshot_store.go | Adds store for planning_context_snapshots. |
| backend/internal/store/backlog_candidate_store.go | Adds feedback fields persistence + validation error type. |
| backend/internal/store/backlog_candidate_feedback_test.go | Tests candidate feedback persistence + run quality summary aggregation. |
| backend/internal/router/router.go | Wires new routes: context-snapshot, suggest-role, connector activity endpoints. |
| backend/internal/roles/catalog_test.go | Updates catalog tests to handle meta-role prompts. |
| backend/internal/roles/catalog.go | Adds dispatcher meta-role to role catalog. |
| backend/internal/prompts/render.go | Embeds prompts/meta/*.md in prompt FS. |
| backend/internal/prompts/meta/dispatcher.md | Adds dispatcher meta-prompt for role classification. |
| backend/internal/planning/wire/context_v2_test.go | Adds tests for context.v2 wire contract + upgrade helper. |
| backend/internal/planning/wire/context_v2.go | Introduces PlanningContextV2 wire envelope + UpgradeV1ToV2. |
| backend/internal/planning/scale/scale_test.go | Adds tests for task scale heuristic. |
| backend/internal/planning/scale/scale.go | Adds task scale heuristic used by snapshot saving. |
| backend/internal/planning/orchestrator.go | Introduces SnapshotSaver plumbing (optional) for context snapshots. |
| backend/internal/models/summary.go | Adds dashboard acceptance-rate fields to API model. |
| backend/internal/models/requirement.go | Adds feedback-kind allowlist + quality summary model; extends planning run with pack ID + quality summary. |
| backend/internal/models/local_connector.go | Adds connector activity types and planning_context_v2 in claim response. |
| backend/internal/handlers/planning_runs_context_test.go | Adds handler tests for context-snapshot endpoint. |
| backend/internal/handlers/planning_runs_context.go | Adds GET /planning-runs/:id/context-snapshot handler. |
| backend/internal/handlers/planning_runs.go | Adds feedback_kind validation and POST .../suggest-role handler wiring. |
| backend/internal/handlers/local_connectors.go | Saves context snapshot on claim; publishes planning-run SSE events. |
| backend/internal/handlers/connector_activity_test.go | Adds handler+store tests for connector activity endpoints. |
| backend/internal/handlers/connector_activity.go | Adds report/get/stream/list-active connector activity endpoints. |
| backend/internal/handlers/candidate_feedback_test.go | Adds handler-level tests for feedback_kind validation. |
| backend/internal/connector/suggest.go | Implements server-side dispatcher prompt execution + parsing. |
| backend/internal/connector/service.go | Reports activity phases during run/task loops via reporter. |
| backend/internal/connector/client.go | Adds client method to POST connector activity. |
| backend/internal/connector/app.go | Starts activity reporter in connector serve mode. |
| backend/internal/connector/activity_reporter.go | Implements coalesced, async activity reporting to server. |
| backend/internal/activity/hub_test.go | Adds tests for in-process activity hub fan-out + persistence behavior. |
| backend/internal/activity/hub.go | Adds in-process hub for activity state + subscriber fan-out + async persistence. |
| backend/db/migrations/034_candidate_feedback.sql | Adds feedback_kind/feedback_note columns to backlog_candidates. |
| backend/db/migrations/034_candidate_feedback.down.sql | SQLite no-op down migration for 034. |
| backend/db/migrations/033_planning_runs_pack_id.sql | Adds context_pack_id to planning_runs. |
| backend/db/migrations/033_planning_runs_pack_id.down.sql | SQLite no-op down migration for 033. |
| backend/db/migrations/032_planning_context_snapshots.sql | Adds planning_context_snapshots table + index. |
| backend/db/migrations/032_planning_context_snapshots.down.sql | Drops context snapshot table/index. |
| backend/db/migrations/031_connector_activity.sql | Adds activity snapshot columns to local_connectors. |
| backend/db/migrations/031_connector_activity.down.sql | Notes for down migration (effectively no-op). |
| backend/cmd/server/main.go | Wires snapshot store, role suggester, activity hub/handler, and SSE broker. |
| Makefile | Adds test-affected* targets (backend/frontend/combined). |
| .github/workflows/ci.yml | Adds change detection job and skips unrelated jobs on PRs. |
…indings Fixes all blocking and should-fix issues found during the full review of feat/phase6c-phase3b-accumulated before merge: Hub (activity/hub.go): - B1: remove close(c) from unsub() — eliminates send-on-closed-channel panic when Update() races with concurrent unsub (channels removed from map only) - B2: add SubscribeWithCap(connectorID, userID) enforcing maxSSEPerUser=3, returns ErrSSECapExceeded; Stream handler now uses it (DECISIONS §(g)) - B3: add StartPurge(ctx) goroutine that evicts idle entries > 5 min old (DECISIONS §(g) "idle activities retained 5 min before purge") - New tests: TestUpdate_ConcurrentUnsub_NoPanic, TestSubscribeWithCap_EnforcesLimit, TestStartPurge_EvictsIdleEntries suggest.go: - B4: sanitizeReasoning strips control chars and truncates to 1024 bytes per DECISIONS 2026-04-25 §(f); applied to reasoning and alternatives[].reason planning_runs.go: - C1(Copilot): SuggestRole always returns HTTP 200; LLM errors in error_kind/ error_message body per API-008 advisory LLM contract connector_activity.go: - B2: Stream uses SubscribeWithCap → 503 on cap exceeded - C4(Copilot): ListActive validates project exists via GetByID before listing planning_run_store.go: - C3(Copilot): log computeQualitySummary errors instead of silently dropping Frontend: - C2(Copilot): PlanningRunContextDrawer sets fetched.current only after successful load so transient errors can be retried on next open - C5(Copilot): useConnectorActivity starts polling interval only in onerror fallback — no longer runs SSE + polling simultaneously (DECISIONS §(g)) Documentation: - DECISIONS.md: add Phase 3B PR-3 entry for candidate feedback / quality summary - docs/api-surface.md: document suggest-role endpoint contract and behavior - docs/data-model.md: advance migration watermark to 034 Other: - models/local_connector.go: PlanningContextV2 gets TODO comment citing Phase 3A spike Gap 2 (field inert until connector protocol versioning resolves it) - backend/cmd/server/main.go: call activityHub.StartPurge(ctx) at startup - suggest_role_test.go: 4 new handler tests for suggest-role (503, 404, LLM-error→200, success→200) filling the MT3 coverage gap Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
8 tasks
screenleon
added a commit
that referenced
this pull request
Apr 27, 2026
… fixes (#29) * feat(phase6c-pr3): advisory LLM router for role dispatch + suggest endpoint Add suggest-only role recommendation flow: SuggestRoleFromContext uses prompt templates in prompts/meta/ to call the configured LLM and returns a suggested role + rationale without auto-applying. Operator must confirm before any catalog write. CandidateRoleEditor gains a "Suggest role" button that surfaces the recommendation inline. DECISIONS.md updated; entries before 2026-04-22 archived to DECISIONS_ARCHIVE.md. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(phase6c-pr4): connector activity SSE + badge + dogfood notes Add ActivityHub (SSE fan-out) + ActivityReporter so local connectors can stream real-time phase/step updates. GET /api/me/local-connectors/:id/activity-stream serves the SSE channel; GET /activity returns the latest snapshot. Frontend: useConnectorActivity hook (SSE-primary, 15 s poll fallback, 90 s stale detection) + ConnectorActivityBadge (compact/standard/full variants). Badge shown inline on active planning runs in PlanningRunList. Dogfood checklist added in docs/phase6c-dogfood-notes.md; operating-rules and rules-quickstart updated with activity-SSE and advisory-router constraints. CI workflow and Makefile gain affected-test helpers. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(phase3b): context pack v2 + evidence panel + candidate feedback + quality view PR-1 — PlanningContextV2 wire struct (schema_version, pack_id, role, intent_mode, task_scale, source_of_truth[]) + scale.EstimateTaskScale heuristic (word-count + keyword overrides). Migrations 032/033 add planning_context_snapshots table and context_pack_id column on planning_runs. ContextSnapshotStore Save/GetByRunID. PR-2 — GET /api/planning-runs/:id/context-snapshot returns structured evidence (sources, counts, role, intent_mode, task_scale). Snapshot saved fire-and-forget in ClaimNextRun where V1 context is built; Orchestrator gets SnapshotSaver interface as hook for future server-provider path. PR-3 — Migration 034 adds feedback_kind/feedback_note columns on backlog_candidates. Optional feedback popover in CandidateReviewPanel (skippable, never blocks approve/reject). QualitySummary computed in PlanningRunStore.GetByID; quality row shown in PlanningRunList once all candidates are reviewed. PR-4 — DashboardSummary gains avg_planning_acceptance_rate and planning_runs_reviewed_count (7-day window, CASE WHEN for SQLite+Postgres compat). ProjectOverviewTab shows acceptance rate inline. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(phase3a-spike): evidence panel + connector v2 dispatch Phase 3A spike findings (docs/phase3a-spike-findings.md): - Connector route viable for CLI tools (Claude, Codex, OpenCode); not viable for Copilot/ChatGPT (no CLI automation surface — use server_provider). - Critical gap identified: Phase 3B backend had GET /context-snapshot but zero frontend; Phase 6d not ready yet (needs dogfood data). Evidence Panel frontend (Phase 3B PR-2 completion): - ContextSnapshot + ContextSnapshotSourceRef types added to types/index.ts. - getContextSnapshot(runId) added to api/client.ts. - PlanningRunContextDrawer: lazy-loaded collapsible drawer per run showing source counts, V2 envelope (role/intent/scale), byte budget, pack_id, source_of_truth files, and truncation warnings when dropped_counts > 0. - PlanningRunList wires the drawer on all completed/failed runs. Connector v2 dispatch upgrade (Gap 2): - LocalConnectorClaimNextRunResponse gains optional planning_context_v2 field. - saveContextSnapshot now returns *wire.PlanningContextV2 so ClaimNextRun can include v2 envelope in the response; connectors can read role/intent_mode/ task_scale without a second round-trip. - Backward-compatible: planning_context (v1) still present for older connectors. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(phase7): dispatch pipeline + file writing + requeue + PR#28 review fixes Phase 7 dispatch fixes: - Migration 035: backfill project_members from planning_runs + local-admin so ClaimNextDispatchTask finds tasks (was always empty due to missing ownership rows) - ProjectStore.CreateWithOwner: transactionally creates project + owner member row; ensureLocalProject and Create handler both use it going forward - connector/service.go: applyExecutionResultFiles writes files[] from execution result JSON to disk under repo_path; RepoPath added to ClaimNextTaskResponse - TaskStore.RequeueDispatchTask + RequeueDispatch handler: lets operator retry stuck failed role_dispatch tasks via POST /api/tasks/:id/requeue-dispatch - planning_runs.go: PromoteToPlannedIfDraft called at run-creation time (fixes dual-badge: requirement showing both "awaiting planning" and "to review") - 30-second progress ticker in connector service logs elapsed time during CLI execution so operators can see whether the agent is still running PR #28 review fixes (critic, risk-reviewer, Copilot): - activity/hub.go: remove close(c) from unsub() — fixes send-on-closed-channel panic when Update() and unsub() race (B1); add SubscribeWithCap enforcing max 3 SSE connections per user (B2/DECISIONS §(g)); add StartPurge goroutine that evicts idle entries older than 5 min (B3/DECISIONS §(g)) - connector/suggest.go: sanitizeReasoning strips control chars and truncates to 1024 chars (B4/DECISIONS §(f)); applies to Reasoning and alternatives[].Reason - handlers/planning_runs.go: SuggestRole always returns HTTP 200; LLM errors are expressed in error_kind/error_message body fields per API-008 (C1/Copilot) - handlers/connector_activity.go: Stream uses SubscribeWithCap; ListActive validates project exists before listing connectors (C4/Copilot) - store/planning_run_store.go: log computeQualitySummary errors instead of silently discarding (C3/Copilot) - frontend/hooks/useConnectorActivity.ts: polling starts only after SSE onerror fires — no longer running both SSE and polling simultaneously (C5/Copilot) - frontend/PlanningRunContextDrawer.tsx: fetched.current set after success so transient errors can be retried on next open (C2/Copilot) - models/local_connector.go: PlanningContextV2 gets TODO comment citing Phase 3A spike Gap 2 so connector implementors know the field is currently inert - handlers/suggest_role_test.go: 4 new tests for suggest-role endpoint (503, 404, LLM-error→200, success→200) — fills the coverage gap flagged by MT3 - activity/hub_test.go: 3 new tests (concurrent unsub race, per-user cap, StartPurge smoke) covering B1/B2/B3 - DECISIONS.md: add Phase 3B PR-3 entry for candidate feedback / quality summary - docs/api-surface.md: document suggest-role endpoint contract - docs/data-model.md: update migration watermark to 034 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(phase7): show files_applied count + handle path-object files in dispatch badge Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(phase7-review): address blocking + should-fix findings from critic/risk review Blocking: - B1: defer close(done/runDone) in RunOnceTask/RunOnce so ticker goroutines exit on all paths including panic (previously only closed inline, not deferred) - B2: reject non-absolute repoPath in applyExecutionResultFiles to prevent accidental writes outside the repo root on misconfigured projects - B3: export PurgeIdle() so tests can invoke it directly; rewrite TestStartPurge_EvictsIdleEntries to TestPurgeIdle_EvictsOldIdleOnly which actually exercises the eviction path (previous test was a false green) Should-fix: - Add explicit nil-user guard in RequeueDispatch (returns 401, not confusing 409) - Update data-model.md migration watermark to 035 - Add requeue-dispatch endpoint to api-surface.md - Add Phase 7 DECISIONS.md entry covering defer-close, best-effort file writes, stuck-running gap (Phase 8 TODO), PurgeIdle export, migration 035 strategy Minor: - UTF-8 safe truncation in sanitizeReasoning (trim to valid rune boundary) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(phase7-copilot): address all 5 Copilot review comments C1 (tasks.go:235): RequeueDispatch now checks task existence with GetByID first — returns 404 for unknown IDs instead of the misleading 409 that ErrDispatchOwnership produces for any zero-row UPDATE C2 (useConnectorActivity.ts): remove direct EventSource creation (UI-007). Per-connector activity stream cannot be centralized in App.tsx without a global stream endpoint (Phase 8 TODO). Converted to polling-only; 15s interval is acceptable for dogfood use. SSE type removed from ActivitySource. C3 (ConnectorActivityBadge.tsx): move from frontend/src/components/ to frontend/src/pages/ProjectDetail/planning/ per DECISIONS.md (ProjectDetail tab/panel components must not live in src/components/) C4 (hub_test.go): already fixed in prior commit — TestStartPurge_EvictsIdleEntries replaced with TestPurgeIdle_EvictsOldIdleOnly which calls PurgeIdle() directly C5 (scale.go:35): remove unused smallKeywords variable (compile error risk) and simplify classification rule comments (rules 3+4 were both "small", now collapsed to rule 3) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Four previously-committed features accumulated on local main without PRs. Bundled as one catch-up PR to satisfy branch protection.
75a54f6): Advisory LLM router for role dispatch —suggest-roleendpoint, dispatcher meta-prompt,actor_auditintegration359d8c4): Connector activity SSE stream +ConnectorActivityBadgefrontend component + Phase 6c dogfood notese2715ea): Context pack v2 —PlanningContextV2wire type,PlanningRunContextDrawerfrontend evidence panel, candidate feedback + quality summary633da43): Phase 3A connector feasibility spike findings,planning_context_v2field inClaimNextRunResponseTest plan
make pre-prgreensuggest-roleendpoint returns role suggestion for a candidate▸ Contextdrawer expands on completed/failed planning runs🤖 Generated with Claude Code