Skip to content

feat(phase6c+phase3b): LLM router, activity SSE, context pack v2, evidence panel#28

Merged
screenleon merged 5 commits into
mainfrom
feat/phase6c-phase3b-accumulated
Apr 27, 2026
Merged

feat(phase6c+phase3b): LLM router, activity SSE, context pack v2, evidence panel#28
screenleon merged 5 commits into
mainfrom
feat/phase6c-phase3b-accumulated

Conversation

@screenleon
Copy link
Copy Markdown
Owner

Summary

Four previously-committed features accumulated on local main without PRs. Bundled as one catch-up PR to satisfy branch protection.

  • phase6c-pr3 (75a54f6): Advisory LLM router for role dispatch — suggest-role endpoint, dispatcher meta-prompt, actor_audit integration
  • phase6c-pr4 (359d8c4): Connector activity SSE stream + ConnectorActivityBadge frontend component + Phase 6c dogfood notes
  • phase3b (e2715ea): Context pack v2 — PlanningContextV2 wire type, PlanningRunContextDrawer frontend evidence panel, candidate feedback + quality summary
  • phase3a-spike (633da43): Phase 3A connector feasibility spike findings, planning_context_v2 field in ClaimNextRunResponse

Test plan

  • make pre-pr green
  • suggest-role endpoint returns role suggestion for a candidate
  • Connector activity badge updates in real-time during planning run
  • ▸ Context drawer expands on completed/failed planning runs
  • Quality summary row appears after all candidates reviewed

🤖 Generated with Claude Code

screenleon and others added 4 commits April 27, 2026 12:04
…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>
Copilot AI review requested due to automatic review settings April 27, 2026 06:18
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment thread backend/internal/handlers/planning_runs.go Outdated
Comment thread backend/internal/store/planning_run_store.go
Comment thread backend/internal/handlers/connector_activity.go Outdated
Comment thread frontend/src/hooks/useConnectorActivity.ts Outdated
…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>
@screenleon screenleon merged commit 3d9e3ae into main Apr 27, 2026
5 checks passed
@screenleon screenleon deleted the feat/phase6c-phase3b-accumulated branch April 27, 2026 07:01
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants