Promote dev to main after NeuralLiquid transfer - #529
Conversation
…eletons FE-005: 5 Zustand stores - useAuthStore: mirrors AuthContext for non-React consumers - useAgentStore: agent registry with real agenticApi integration - useDashboardStore: dashboard data (fetch-based, pending backend endpoints) - useNotificationStore: in-app notifications with unread tracking - usePreferencesStore: persisted user preferences (theme, accessibility) FE-022: Navigation components - Sidebar with collapsible sections, active route highlighting - TopBar with breadcrumbs, notification bell, connection indicator - MobileMenu responsive drawer (<768px) FE-021: Multi-page routing - (app) route group with shared layout (sidebar + topbar + ProtectedRoute) - 6 routes: /dashboard, /agents, /analytics, /compliance, /marketplace, /settings - Per-route loading.tsx and error.tsx boundaries - Dashboard page wired to useDashboardStore - Agents page wired to useAgentStore with table view - Settings page wired to usePreferencesStore with toggle controls FE-003: SignalR real-time client - useSignalR hook with auto-reconnect (exponential backoff) - subscribe/unsubscribe/invoke/joinGroup/leaveGroup methods - ConnectionIndicator component shows live status FE-007: Skeleton loading components - Skeleton, SkeletonCard, SkeletonTable, SkeletonMetric, SkeletonDashboard Dependencies: zustand@5.0.11, @microsoft/signalr@10.0.0 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Root `/` now redirects to `/dashboard` (server-side via next/navigation) - Deleted `services/api.ts` (DashboardAPI singleton with hardcoded mock data) - Deleted `hooks/useDashboardData.ts` (hook wrapper around mock) - Dashboard page uses `useDashboardStore` fetching from real backend - Updated AGENT_BACKLOG.md: Phase 14 marked complete, Phase 14b added (CognitiveMeshUI component library integration) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…tness Backend: - CORS empty-origins guard in Program.cs - Replace ThrowIfNullOrWhiteSpace with BadRequest in AdaptiveBalanceController - Add ProducesResponseType attributes, CancellationToken forwarding, error handling in AgentController and CustomerServiceController - Simplify AgentRegistryService circuit breaker delegation - Fix AuthorityService RevokeAuthorityOverrideAsync return and null-forgiving Frontend: - Prevent open redirect in login returnTo validation - Move ApiBootstrap inside ErrorBoundary in layout - Dev-only error messages in ErrorBoundary and error page - Guard e.message in ExtensionErrorSuppressor - Keyboard a11y on agent table rows, settings focus styles, label htmlFor - MobileMenu active state fix, Escape key, backdrop aria-hidden - navItems fallback group in groupBySections - Add pathname to ProtectedRoute useEffect deps - Toast aria-live on container - Fix agent store name mapping and dashboard store error handling - Auth context: logout in proactive-refresh deps, Secure cookie flag Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Feat/frontend phase 13
Brings in ESLint migration (next lint → eslint .), CodeQL LogSanitizer fix, CI type-check continue-on-error, and all Phase 13 fixes. Resolves CustomerServiceController conflict by keeping try/catch + Sanitize(). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sync with latest dev to resolve PR merge conflicts. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- AGENT_BACKLOG.md: fix item count (29→27), fix circular gate deferral - AgentController: propagate CancellationToken to all registry port calls - IAgentRegistryPort: add CancellationToken to Register/GetById/Deactivate - AgentRegistryService: sanitize framework in compliance status log - CustomerIntelligenceManager: sanitize customerId in exception message, escape single quotes in Cypher query to prevent injection - NISTComplianceService: sanitize audit entry Details fields, lock EvidenceRecord mutation for thread safety, capture TotalCount inside lock for consistent snapshot - AdaptiveBalanceService: snapshot ConcurrentBag for confidence calc, lock DimensionState reads/writes for atomic updates - Agents page: remove role="grid" (no 2D nav), add focus-visible ring - Remove coverage/ artifacts from git, add to .gitignore Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Phase 14: Core UX — stores, navigation, routing, real API
Merge pull request #348 from phoenixvc/feat/frontend-phase-13
chore(deps): pin dependency node to 22.22.1
The peaceiris/actions-gh-pages action needs push access to the gh-pages branch. Added job-level permissions and removed unused ACTIONS_DEPLOY_KEY env. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fix gh-pages deploy permissions
…s, Tailwind v4 Merge CognitiveMeshUI repo (169 files): 48 shadcn/ui components with Radix UI deps, design tokens via Style Dictionary v5, Storybook v10 config. Key changes: - Install 27 @radix-ui/* packages + cmdk, recharts@3, sonner, vaul, etc. - Move components/ui/ → src/components/ui/ with TS validation enabled - Move hooks (use-mobile, use-toast) and theme-provider into src/ - Add lib/utils.ts (shadcn cn() helper) - Migrate Tailwind v3 → v4 (@tailwindcss/postcss + @config directive) - Fix all 150+ TypeScript errors across components, visualizations, lib modules - Harden Next.js 16 SSR (Suspense boundaries, window guards, env fallbacks) - Remove dead code: BridgeHeader, FXModePanel, LayoutToolsPanel, VoiceFeedback - Delete duplicate /settings route (kept (app)/settings) - Update MIGRATION.md (100% complete) and AGENT_BACKLOG.md (Phase 14b ✓) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Phase 14b: UI component library integration
chore(deps): update entity framework core to v10.0.4
fix(deps): pin dependencies
chore(deps): update microsoft.extensions to v10.0.4
fix(deps): update all non-major dependencies
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* Phase 15 Batch A: Settings, Notification Preferences, User Profile FE-008: Enhanced settings page with language selector (en-US/fr-FR/de-DE), Data & Privacy consent toggles (analytics, telemetry, personalized content, third-party sharing), descriptions on all toggles, save confirmation. FE-009: New /settings/notifications page with channel toggles (email, push, SMS, in-app), 5 notification categories with per-category enable/disable, quiet hours with start/end time and timezone. FE-010: New /profile page with account info, role badges (Admin/Analyst/ Viewer), GDPR & EU AI Act consent management (4 consent types), privacy summary with status dots, data export request (GDPR Article 20), session info. Added Profile nav item with User icon to sidebar. Store: Extended usePreferencesStore with language, privacyConsent, and notificationPreferences state + actions (setLanguage, setPrivacyConsent, setNotificationChannel, setQuietHours). Build: 14 pages generated (was 12), 0 TypeScript errors. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Address PR review findings: Link, i18n, GDPR persistence, shared toggle - Replace <a> with Next.js <Link> in settings, notifications, profile pages - Call i18n.changeLanguage() on language select for immediate effect - Move GDPR consent from local useState to Zustand store (persisted) - Add GdprConsentRecord type + setGdprConsent action to preferences store - Fix "Authenticated since" to use useMemo (stable across re-renders) - Extract shared ToggleRow/ToggleButton to components/ui/toggle-switch.tsx - Replace freeform timezone input with curated timezone <select> - Add accessible label (htmlFor) to timezone select - Fix store doc comment: local-only with TODO for backend sync - Use canonical Tailwind class bg-white/2 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Fix ~40 code quality issues across backend and frontend Backend: CancellationToken propagation, atomic ConcurrentDictionary updates, Cypher injection prevention via regex validation, authority override revocation. UI components: forwardRef type corrections, aria-hidden/aria-label a11y fixes, event listener cleanup, CSS sanitization for dangerouslySetInnerHTML, unique keys with index fallback, variant priority fix, displayName casing. Pages/hooks/stores: open redirect prevention, SSR hydration fix, timer cleanup, SignalR mounted guard, auth token expiry check, Array.isArray guard, crypto randomUUID replacing module counter, Zustand persist with versioned migration, devDependencies cleanup, dark-themed select options. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Phase 15b: 5 widget PRDs, frontend Docker, K8s, Terraform Widgets (FE-011 to FE-015): - NIST Compliance: maturity gauge, gap analysis table, compliance timeline - Adaptive Balance: spectrum sliders, balance history chart - Value Generation: radar chart, organizational blindness heatmap - Impact Metrics: safety gauge, impact radar, resistance timeline - Cognitive Sandwich: phase stepper, burndown chart CI/CD (FECICD-002 to FECICD-004): - Frontend Dockerfile (multi-stage, standalone, non-root) - Docker Compose with frontend + API services - Frontend deploy pipeline (ACR → AKS staging → prod) - Dependabot npm coverage for frontend deps - CodeQL TypeScript analysis Infrastructure (FECICD-005, FECICD-006): - K8s frontend manifests (deployment, service, configmap, ingress) - K8s overlays (dev: 1 replica, staging: 2, prod: 3 + TLS) - Terraform frontend-hosting module (Azure App Service, Node.js 22) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Orchestrator: Phase 15 complete — 95/109 items done Frontend grade C→B. 5 widget PRDs built (NIST, Adaptive Balance, Value Gen, Impact Metrics, Cognitive Sandwich). Frontend Docker, K8s manifests, Terraform module, deploy pipeline, Dependabot npm, CodeQL TypeScript all added. 14 items remaining for Phases 16-17. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* docs: refresh cognitive mesh migration package * docs: address migration package review * docs: align sluice routing handoff
* infra: add cognitive mesh routing settings * infra: require managed sluice key reference
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* fix(deploy): wire Docket usage auth settings * fix(deploy): preserve optional Sluice and Docket settings * chore: retrigger validation * fix(deploy): pass optional settings through env
* fix(deploy): support Docket API key bridge * fix(deploy): clear stale Docket bridge key
* docs(agent-ops): add workflow contract schemas * docs(agent-ops): address contract review feedback * docs(agent-ops): tighten gate id validation
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* fix(deploy): persist Sluice gateway secret bridge * docs: refresh Sluice Key Vault closeout * docs: assign remaining migration gates
…tart docs: close Batch 2 NeuralLiquid migration prep
docs: record Batch 3 NeuralLiquid transfer
Merged post-transfer hardening: restored collaborator admin access, reconciled prod Terraform/App Service drift, imported NeuralLiquid DNS records into Terraform state, removed Terragrunt root warning, and documented Docket attribution smoke evidence.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: ad2c84d3c9
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| telemetry.GetRecent(limit.GetValueOrDefault(25)))); | ||
| }); | ||
| app.MapGet("/api/v1/docket/usage/recent", (IDocketUsageRecorder docket) => Results.Ok(docket.GetRecent(25))); | ||
| app.MapPost("/api/v1/docket/usage", (DocketUsageEvent usageEvent, IDocketUsageRecorder docket) => |
There was a problem hiding this comment.
Require auth before forwarding usage telemetry
In the public ApiHost, this new POST endpoint accepts any request and then forwards the payload to Docket using the service's configured API key/bearer token. In production contexts where the API host is internet-reachable, an unauthenticated caller can inject arbitrary model-usage events and corrupt cost/funding telemetry; add authentication/authorization or restrict this route to a trusted internal caller before forwarding.
Useful? React with 👍 / 👎.
| builder.Services.AddImpactMetricsServices(); | ||
| builder.Services.AddCognitiveMeshRealTime(); | ||
| builder.Services.AddSingleton<ModelRoutingTelemetryStore>(); | ||
| builder.Services.AddHttpClient<IDocketUsageRecorder, DocketUsageRecorder>(); |
There was a problem hiding this comment.
Preserve Docket usage events across requests
AddHttpClient<TClient,TImplementation>() registers the typed client as transient, so every /api/v1/docket/usage POST and /api/v1/docket/usage/recent GET gets a fresh DocketUsageRecorder with its own queue. In the normal API request flow, a recorded event is lost as soon as that request ends, and the recent/summary endpoints only see their newly constructed seed event; make the recorder state singleton/shared while still using an HttpClient from the factory for forwarding.
Useful? React with 👍 / 👎.
| var result = await container.UpsertItemAsync( | ||
| policy, | ||
| new PartitionKey(policy.IncidentCategory), | ||
| cancellationToken: ct).ConfigureAwait(false); |
There was a problem hiding this comment.
Store policy versions under distinct Cosmos documents
When an existing policy is revised with the same id and partition key, this UpsertItemAsync(policy, ...) writes the new version back to the exact same Cosmos document that was just marked inactive, so the inactive prior version is overwritten. As a result GetPolicyHistoryAsync cannot return the full version history promised by the port, and delete/history operations only see the latest document; persist each version with a distinct document id or separate version key while keeping a stable policy id for lookups.
Useful? React with 👍 / 👎.
|
Closing this direct dev-to-main promotion PR because GitHub reports merge conflicts. Replaced by an integration branch that merges dev into main and resolves conflicts while preserving the System.Text.Json migration path. |
Summary
Verification