diff --git a/.squad/.first-run b/.squad/.first-run deleted file mode 100644 index 21f0267a..00000000 --- a/.squad/.first-run +++ /dev/null @@ -1 +0,0 @@ -2026-03-26T22:54:46.392Z diff --git a/.squad/config.json b/.squad/config.json deleted file mode 100644 index 81745113..00000000 --- a/.squad/config.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "version": 1 -} \ No newline at end of file diff --git a/.squad/log/2025-03-21T15-05-mongodb-config-fix.md b/.squad/log/2025-03-21T15-05-mongodb-config-fix.md deleted file mode 100644 index 79b49fc4..00000000 --- a/.squad/log/2025-03-21T15-05-mongodb-config-fix.md +++ /dev/null @@ -1,12 +0,0 @@ -# Session Log: MongoDB Config Fix - -**Timestamp:** 2025-03-21T15:05:00Z -**Agent:** Sam (Backend Developer) -**Topic:** MongoDB connection string configuration fallback - -## Summary - -Fixed `TimeoutException` in Web project startup by implementing config fallback logic. EF Core MongoDB provider (`MongoDB:ConnectionString`) now checks `ConnectionStrings:mongodb` (Aspire-injected) when default is empty or localhost. Updated `ServiceCollectionExtensions.cs` to read config section before Options binding, and cleared hardcoded localhost from `appsettings.Development.json`. - -**Files Changed:** 2 -**Status:** ✅ Complete diff --git a/.squad/log/2025-03-29T08-33-36Z-ralph-session-complete.md b/.squad/log/2025-03-29T08-33-36Z-ralph-session-complete.md deleted file mode 100644 index dce0b36e..00000000 --- a/.squad/log/2025-03-29T08-33-36Z-ralph-session-complete.md +++ /dev/null @@ -1,41 +0,0 @@ -# Ralph Session Complete — Session Log - -**Timestamp:** 2025-03-29T08:33:36Z -**Session Topic:** PR #86 E2E test failures, Issues page bugs, accessibility -**Outcome:** MERGED ✅ - -## Session Summary - -### Problem Identified -Ralph discovered 2 failing Aspire+Playwright E2E tests within PR #86, plus related Issues page bugs and accessibility issues. - -### Team Work -1. **Ralph** (QA Lead) - - Identified failing E2E tests - - Diagnosed polling issues (/health → /alive endpoint) - - Flagged theme localStorage assertion failures - - Reported dual theme system conflict - -2. **Pippin** (Frontend Engineer) - - Fixed E2E test startup polling logic - - Updated theme localStorage key assertions - - Unified theme system handling - -3. **Aragorn** (Lead Developer) - - Resolved theme system conflict - - Removed redundant theme-manager.js - - Unified themeManager + tailwind-color-theme approach - -### Results -- ✅ All 23 CI checks passed -- ✅ All 40 E2E tests passed -- ✅ PR merged to main (squash commit) -- ✅ Branch deleted - -### Artifacts -- Orchestration log: `2025-03-29T08-33-36Z-pr86-merged.md` -- Test results: All 40 E2E tests passing -- CI pipeline: 23/23 checks green - -### Notes -Board is clear — no blocking issues remain. Ready for deployment. diff --git a/.squad/log/2026-03-17T17-26-00Z-di-lifetime-fix.md b/.squad/log/2026-03-17T17-26-00Z-di-lifetime-fix.md deleted file mode 100644 index 7c21c108..00000000 --- a/.squad/log/2026-03-17T17-26-00Z-di-lifetime-fix.md +++ /dev/null @@ -1,19 +0,0 @@ -# Session Log: DI Lifetime Fix - -**Timestamp:** 2026-03-17T17:26:00Z -**Topic:** Dependency Injection lifetime validation fixes - -## Work Completed - -Sam fixed two startup-blocking DI mismatches: - -1. **ServiceCollectionExtensions.cs** → Scoped `DbContextFactory` registration -2. **BulkOperationBackgroundService.cs** → Removed unused scoped dependency - -## Outcome - -✅ Build passes, startup validation resolved - -## Decision Recorded - -`.squad/decisions/inbox/sam-di-lifetime-fix.md` — establishes team rules for DbContext/DbContextFactory alignment and singleton background service patterns diff --git a/.squad/log/2026-03-17T18-54-25Z-auth0-nav-fix.md b/.squad/log/2026-03-17T18-54-25Z-auth0-nav-fix.md deleted file mode 100644 index e92f6780..00000000 --- a/.squad/log/2026-03-17T18-54-25Z-auth0-nav-fix.md +++ /dev/null @@ -1,57 +0,0 @@ -# Session: Auth0 Navigation & Role Fix (2026-03-17T18:54:25Z) - -**Duration:** 2 agents, parallel execution -**Agents:** Gandalf (Security), Legolas (Frontend) -**Outcome:** Both missions completed successfully - ---- - -## Summary - -Team executed coordinated sprint to fix Auth0 role-based authorization and implement role-gated navigation UI. - -**Gandalf** implemented claims transformation to map Auth0 custom role claims to ASP.NET Core standard claims, unblocking role-based authorization. - -**Legolas** built navigation sidebar component with role-based visibility and redesigned landing page for authenticated/unauthenticated states. - -**Result:** Authentication and navigation infrastructure now functional. Both builds pass. - ---- - -## Key Decisions Recorded - -1. **Auth0 Role Claim Mapping** (IClaimsTransformation service) -2. **Navigation Menu Architecture** (sidebar + dual-state landing) -3. **Switch to MongoDB Atlas** (previously recorded; included in merged decisions) -4. **User Directive:** MongoDB connection string from Atlas (not container) - ---- - -## Next Steps - -- Configure Auth0 tenant role claim namespace in user secrets (both developers) -- Test role-based page access with Admin and User roles -- Consider mobile responsiveness for sidebar (future sprint) -- Expand navigation items as new features are added - ---- - -## Files - -**Orchestration Logs:** -- `.squad/orchestration-log/2026-03-17T18-54-25Z-gandalf.md` -- `.squad/orchestration-log/2026-03-17T18-54-25Z-legolas.md` - -**Decisions:** -- Merged 4 inbox files into `.squad/decisions.md` (see log below) - ---- - -## Decisions Merged - -- `gandalf-auth0-role-mapping.md` ✅ -- `legolas-nav-menu.md` ✅ -- `boromir-atlas-connection.md` ✅ -- `copilot-directive-2026-03-17T17-38.md` ✅ - -**Deduplication:** No duplicates found across merged decisions. diff --git a/.squad/log/2026-03-19T15-44-51Z-buildinfo-fix.md b/.squad/log/2026-03-19T15-44-51Z-buildinfo-fix.md deleted file mode 100644 index 373b9d41..00000000 --- a/.squad/log/2026-03-19T15-44-51Z-buildinfo-fix.md +++ /dev/null @@ -1,16 +0,0 @@ -# Session Log: BuildInfo Generation Fix - -**Timestamp:** 2026-03-19T15:44:51Z - -## Work Summary -- Fixed stderr contamination in MSBuild git commands -- Created v0.1.0 git tag -- Verified BuildInfo.g.cs generation and FooterComponent tests -- All agents succeeded; no blockers - -## Agents Involved -1. **Boromir** — Fixed Web.csproj git command stderr redirect -2. **Gimli** — Verified build output and test suite - -## Next -Merge decision inbox, archive old decisions, update agent histories. diff --git a/.squad/log/2026-03-21T15:42:40Z-pr60-review.md b/.squad/log/2026-03-21T15:42:40Z-pr60-review.md deleted file mode 100644 index 04f0f187..00000000 --- a/.squad/log/2026-03-21T15:42:40Z-pr60-review.md +++ /dev/null @@ -1,15 +0,0 @@ -# Session Log — PR #60 Review - -**Timestamp:** 2026-03-21T15:42:40Z -**Topic:** PR #60 MongoDB Connection String Fallback + Cleanup Review - -## Summary - -Three agents (Aragorn, Sam, Gimli) reviewed PR #60 comments. Consensus: - -- **Test Coverage:** BLOCKING — fallback logic lacks unit tests (5 scenarios) -- **Build Log:** Valid but non-blocking — contradictory summary vs. output -- **Squad Files:** Blocking — `.squad/` files should not be in feature branch PR -- **History Date:** Non-blocking documentation hygiene issue - -**Status:** CHANGES REQUESTED before merge diff --git a/.squad/log/2026-03-27T14-05-27Z-playwright-e2e-tests.md b/.squad/log/2026-03-27T14-05-27Z-playwright-e2e-tests.md deleted file mode 100644 index bde4466b..00000000 --- a/.squad/log/2026-03-27T14-05-27Z-playwright-e2e-tests.md +++ /dev/null @@ -1,40 +0,0 @@ -# Session Log: AppHost.Tests Playwright E2E tests — 2026-03-27T14:05:27Z - -## Summary -Team successfully created and integrated 10 Playwright E2E test files for the AppHost.Tests project, implementing end-to-end testing infrastructure for the IssueTrackerApp web application. - -## Agents Involved -- **Gimli** (Tester): Created test files, auth state management, theme validation -- **Boromir** (Dependency Manager): Centralized package management, Aspire.Hosting.Testing integration -- **Aragorn** (Infrastructure): Template rewrite, integration test refactoring, project reference fixes - -## Key Deliverables - -### Test Files Created (10 total) -- AuthStateManager.cs — Auth0 login caching via Playwright storage state -- BasePlaywrightTests.cs — Base test class with browser initialization -- LayoutAnonymousTests.cs — Anonymous user layout tests -- LayoutAuthenticatedTests.cs — Authenticated user layout tests -- HomePageTests.cs — Home page navigation and rendering -- DashboardPageTests.cs — Dashboard access and functionality -- NotFoundPageTests.cs — 404 error handling -- IssueIndexPageTests.cs — Issue list page tests -- ThemeToggleTests.cs — Dark/Light/System theme switching -- ColorSchemeTests.cs — Color scheme selection (Blue/Red/Green/Yellow) - -### Build Status -- 0 errors -- 0 warnings -- All tests compile successfully - -### Architecture Decisions -1. **Auth State Pattern:** Single Auth0 login cached to JSON; reused across authenticated tests -2. **Theme Testing:** DOM selectors for `classList.contains('dark')` and `getAttribute('data-theme')` -3. **CPM:** All NuGet versions centralized in Directory.Packages.props -4. **Integration:** Proper ProjectReference paths to Web, Domain, and Persistence assemblies - -## Commits -- Gimli: df31e68 — [PLAYWRIGHT] Created 10 E2E test files for AppHost.Tests - -## Decision Inbox -- 1 new decision: "Playwright Theme DOM Assertions & Auth0 State Pattern" (gimli-playwright-theme-dom.md) diff --git a/.squad/log/2026-03-27T22-09-00Z-pr81-review-merge.md b/.squad/log/2026-03-27T22-09-00Z-pr81-review-merge.md deleted file mode 100644 index 17e20f27..00000000 --- a/.squad/log/2026-03-27T22-09-00Z-pr81-review-merge.md +++ /dev/null @@ -1,31 +0,0 @@ -# Session Log: PR #81 Review & Merge - -**Date:** 2026-03-27T22:09:00Z -**Topic:** GitHub Pages workflow security hardening -**Status:** COMPLETED & MERGED - -## Summary - -PR #81 underwent comprehensive multi-agent review across architecture, DevOps, and security domains. - -### Review Phase - -- **Aragorn (Lead):** REJECTED — path and squad-docs conflicts identified -- **Boromir (DevOps):** REJECTED — path scope, paths filter, and permissions level issues -- **Gandalf (Security):** REJECTED — HIGH severity (SECRETS.md exposure), LOW severity (permissions scope) - -### Fix Phase - -Boromir applied all blockers: -1. Scoped GitHub Pages artifact path from `.` to `docs/` (prevents SECRETS.md exposure) -2. Corrected workflow trigger `paths:` filter configuration -3. Moved permissions from workflow level to job level (defense in depth) -4. Removed `pages: write` from workflow-level permissions block - -### Merge - -PR squash-merged to main after unanimous re-approval. Branch deleted. - -## Key Decision - -**GitHub Pages path must be `docs/` not `.`** — protects sensitive files and source tree from public exposure. diff --git a/.squad/log/2026-03-27T22:42:44Z-issues-77-78-79-80.md b/.squad/log/2026-03-27T22:42:44Z-issues-77-78-79-80.md deleted file mode 100644 index da82eb7f..00000000 --- a/.squad/log/2026-03-27T22:42:44Z-issues-77-78-79-80.md +++ /dev/null @@ -1,63 +0,0 @@ -# Session Log: Issues #77–#80 Resolution - -**Timestamp:** 2026-03-27T22:42:44Z -**Session:** Pippin + Legolas Squad Work -**Outcome:** ✅ All 4 issues closed, 2 PRs merged - -## Summary - -Four test/UX issues resolved in a single coordinated squad run: - -### Frontend: Issue #77 (Legolas) - -**Missing `/Account/AccessDenied` page** - -- Auth0 redirects denied users to `/Account/AccessDenied` (ASP.NET Core convention) -- App had no Blazor component at this route; users hit NotFound -- **Fix:** Created `src/Web/Components/Pages/Account/AccessDenied.razor` - - Static, public page with friendly error copy - - `@layout MainLayout` (consistent UX) - - Tailwind `neutral-*` styling -- **PR:** #83 (Approved by Aragorn, Gandalf) -- **Status:** Merged ✅ - -### Test Quality: Issues #78, #79, #80 (Pippin) - -**Three blocking test issues in `AppHost.Tests`** - -1. **#78 — TimeoutException not surfaced** - - `WaitForWebReadyAsync` polling loop let `OperationCanceledException` escape - - Fix: Wrap loop to throw `TimeoutException` on deadline expiry - - Semantics: `OperationCanceledException` = cooperative cancellation; `TimeoutException` = deadline - -2. **#79 — Dashboard enabled in tests** - - `EnvVarTests.cs` was the only test missing `DisableDashboard = true` - - Fix: Add consistent config pattern used by `AspireManager.cs` - - Reason: Prevents Aspire dashboard resource waste in CI - -3. **#80 — Weak heading assertion** - - `text.Should().NotBeNullOrWhiteSpace()` is non-specific (any non-empty string passes) - - Fix: Replace with `text.Should().Be("Admin Dashboard")` (exact match) - - Charter rule: Assertions must be specific - -- **PR:** #84 (Approved by Aragorn, Gimli) -- **Status:** Merged ✅ - -## Team Coordination - -| Member | Role | Action | -|--------|------|--------| -| Pippin | E2E & Aspire Tester | Fixed #78, #79, #80 | -| Legolas | Frontend Developer | Created /Account/AccessDenied page (#77) | -| Aragorn | Tech Lead | Reviewed both PRs, approved | -| Gimli | QA | Reviewed PR #84, approved | -| Gandalf | Wizard | Reviewed PR #83, approved | - -## Decisions - -Two decisions recorded in `.squad/decisions/inbox/`: - -1. `pippin-test-fixes-78-79-80.md` — Test quality fixes, exception semantics, assertion specificity -2. `legolas-access-denied-77.md` — AccessDenied page design, auth flow, UX impact - -Both ready to merge into `decisions.md`. diff --git a/.squad/log/2026-03-29-ralph-pr102-merged.md b/.squad/log/2026-03-29-ralph-pr102-merged.md deleted file mode 100644 index c98e7df4..00000000 --- a/.squad/log/2026-03-29-ralph-pr102-merged.md +++ /dev/null @@ -1,11 +0,0 @@ -# Session Log — PR #102 Merged - -**Date:** 2026-03-29 - -**Agent:** Ralph (Work Monitor) - -**Work:** 1 cycle — PR #102 ("style: UI polish — nav, footer, SignalR, dashboard cleanup") passed all CI checks and was merged via squash merge. - -**Board:** 0 open issues, 0 open PRs. Board cleared post-merge. - -**Status:** ✅ Complete diff --git a/.squad/log/2026-03-29T14:58:15Z-ralph-round1.md b/.squad/log/2026-03-29T14:58:15Z-ralph-round1.md deleted file mode 100644 index 621cdd06..00000000 --- a/.squad/log/2026-03-29T14:58:15Z-ralph-round1.md +++ /dev/null @@ -1,15 +0,0 @@ -# Ralph Work-Check Round 1 - -**Timestamp:** 2026-03-29T14:58:15Z -**Coordinator:** Ralph - -## Summary -Scanned team issues and PRs. Found 0 open squad-labeled issues. Identified PR #86 with 2 failing E2E tests (Redis timeout). Routed to Pippin for triage and fix. - -## Findings -- **Open Squad Issues:** 0 -- **Failing PR:** #86 (E2E tests failing due to health-check polling timeout) -- **Action:** Escalated to Pippin (Tester E2E & Aspire) - -## Status -✅ Round 1 complete. Work routed. diff --git a/.squad/log/2026-03-29T15-20-55Z-ralph-round2.md b/.squad/log/2026-03-29T15-20-55Z-ralph-round2.md deleted file mode 100644 index 620d96fd..00000000 --- a/.squad/log/2026-03-29T15-20-55Z-ralph-round2.md +++ /dev/null @@ -1,34 +0,0 @@ -# Session Log: Ralph Round 2 — Coordinator - -**Timestamp:** 2026-03-29T15:20:55Z -**Coordinator:** Ralph -**Round:** 2 -**Status:** ✅ Complete - -## Summary - -Ralph analyzed Pippin's theme test fixes and routed the production bug (dual theme system) to Aragorn for architectural consolidation. - -## Inputs - -- **Pippin outcome:** Fixed ThemeToggleTests and ColorSchemeTests (localStorage key from `theme-color-brightness` → `tailwind-color-theme`). Discovered dual theme system conflict in production code. -- **Production issue:** Two coexisting theme systems with different localStorage keys → theme persistence fails on page reload. - -## Routing Decision - -**Dual Theme System Consolidation → Aragorn (Backend Developer)** - -- **Rationale:** Backend developer with domain expertise should own theme system unification -- **Context:** PR #86 introduced new theme components that conflict with existing `ThemeProvider` system -- **Scope:** Consolidate to single theme system, ensure theme preferences persist correctly across page reloads -- **Depends on:** Completion of current theme test fixes (Pippin's work) - -## Decision Created - -Merged Pippin's theme test fix decision into `.squad/decisions.md` with production issue flagged. - -## Next Steps - -1. Aragorn implements theme system consolidation (target: next round) -2. Full E2E validation in CI -3. Archive old decisions if file size exceeds ~20KB after merge diff --git a/.squad/log/2026-03-29T16:55:42Z-boromir-dependabot-merge.md b/.squad/log/2026-03-29T16:55:42Z-boromir-dependabot-merge.md deleted file mode 100644 index c6c84147..00000000 --- a/.squad/log/2026-03-29T16:55:42Z-boromir-dependabot-merge.md +++ /dev/null @@ -1,10 +0,0 @@ -# Session Log — Boromir Dependabot Merge (2026-03-29T16:55:42Z) - -**Agent:** Boromir -**Topic:** Dependabot PR #87 Merge - -## Work Summary -Reviewed and merged Dependabot PR #87 containing 5 GitHub Actions updates. All 19 CI checks passed. Used squash-merge strategy to main branch. - -## Status -✅ Complete — PR merged successfully. diff --git a/.squad/log/2026-03-29T17:03:05Z-footer-text-size.md b/.squad/log/2026-03-29T17:03:05Z-footer-text-size.md deleted file mode 100644 index a7dcbaa0..00000000 --- a/.squad/log/2026-03-29T17:03:05Z-footer-text-size.md +++ /dev/null @@ -1,17 +0,0 @@ -# Session Summary: Footer Text Size Unification - -**Date:** 2026-03-29 -**Duration:** Background task (Legolas) - -## Work Completed -Legolas removed `text-xs` and `txt-3xl` typo from FooterComponent.razor. All footer text now uses `text-base` for consistency. - -## Status -✅ Ready for merge - -## Files Changed -- `src/Web/Components/Layout/FooterComponent.razor` -- `src/Web/wwwroot/css/app.css` - -## Decision Recorded -Decision entry merged from inbox: `legolas-footer-text-size.md` diff --git a/.squad/log/2026-03-29T17:04:58Z-signalr-text-size.md b/.squad/log/2026-03-29T17:04:58Z-signalr-text-size.md deleted file mode 100644 index e742e3a9..00000000 --- a/.squad/log/2026-03-29T17:04:58Z-signalr-text-size.md +++ /dev/null @@ -1,11 +0,0 @@ -# Session Log: SignalR Label Sizing - -**Timestamp:** 2026-03-29T17:04:58Z -**Agent:** Legolas (Frontend Dev) - -## Work Complete - -Removed `text-xs` from SignalRConnection.razor state label spans. Labels now match nav menu link size (text-base). - -**Files:** `src/Web/Components/Shared/SignalRConnection.razor` - diff --git a/.squad/log/2026-03-29T18:08:58Z-role-claims-fix.md b/.squad/log/2026-03-29T18:08:58Z-role-claims-fix.md deleted file mode 100644 index e0cd7f3f..00000000 --- a/.squad/log/2026-03-29T18:08:58Z-role-claims-fix.md +++ /dev/null @@ -1,20 +0,0 @@ -# 2026-03-29T18:08:58Z — Auth0 Role Claims Fix Sprint Complete - -## Summary -Sprint 1–3 complete: Aragorn diagnosed and configured Auth0 namespace, Sam added Pass 3 auto-detect failsafe, Legolas hardened Profile.razor UI. - -## Issues Resolved -- **#88:** Diagnosed Auth0 role claim type (Aragorn) -- **#89:** Config fix—set Auth0:RoleClaimNamespace (Aragorn) -- **#90:** Added Pass 3 auto-detect to Auth0ClaimsTransformation (Sam) -- **#91:** Fixed Profile.razor GetAllRoleClaims to include namespace claim (Legolas) - -## Key Decisions Merged -1. **Aragorn:** Auth0 namespace = `"https://issuetracker.com/roles"` -2. **Sam:** Pass 3 auto-detect scans all claims ending in `/roles` when Passes 1–2 fail -3. **Legolas:** Profile.razor GetAllRoleClaims accepts optional namespace param, belt-and-suspenders - -## Build Status -- All 3 agents: Build clean, tests passing -- Total: 10 new tests (2 NavMenu + 8 ProfileRoles) -- Code changes: appsettings.Development.json, Auth0ClaimsTransformation.cs, Profile.razor, tests diff --git a/.squad/log/2026-03-29T18:47:42Z-adminlayout-fix.md b/.squad/log/2026-03-29T18:47:42Z-adminlayout-fix.md deleted file mode 100644 index 5fff3954..00000000 --- a/.squad/log/2026-03-29T18:47:42Z-adminlayout-fix.md +++ /dev/null @@ -1,27 +0,0 @@ -# Session Log — AdminPageLayout Sprint 2 - -**Timestamp:** 2026-03-29T18:47:42Z -**Branch:** squad/90-auth0-claims-pass3-auto-detect - -## Sprint Summary - -**Milestone:** AdminPageLayout component guardrails and test coverage -**Team:** Legolas (UI) + Gimli (Tests) - -### Deliverables -1. ✅ AdminPageLayout.razor: Added warning comment (Legolas) -2. ✅ AdminPageLayoutTests.cs: 14 bUnit tests with reflection guards (Gimli) - -### Key Outcomes -- Component usage contract now explicit: `` only, never `@layout` -- Reflection-based guard prevents accidental `LayoutComponentBase` inheritance -- Build clean, all tests passing - -### Build & Test Results -- Build: ✅ Clean -- Tests: ✅ 14/14 passing -- No regressions - -### Artifacts -- Orchestration logs: legolas-adminlayout.md, gimli-adminlayout.md -- Test file: AdminPageLayoutTests.cs (14 tests, 100% pass rate) diff --git a/.squad/log/2026-03-29T21-49-00Z-pr-review-process.md b/.squad/log/2026-03-29T21-49-00Z-pr-review-process.md deleted file mode 100644 index b0521bb7..00000000 --- a/.squad/log/2026-03-29T21-49-00Z-pr-review-process.md +++ /dev/null @@ -1,7 +0,0 @@ -# Session: Formal PR Review Process Implementation - -**Date:** 2026-03-29T21:49:00Z -**Agents:** Aragorn (Lead), Boromir (DevOps) -**Requested by:** Matthew Paulosky - -Aragorn and Boromir implemented a complete formal PR review process. Aragorn established ceremonies (PR Review Gate, CHANGES_REQUESTED handling with lockout, conflict resolution), updated routing logic to track 4 new PR state signals (CHANGES_REQUESTED, CONFLICTED, CI FAILURE, ready-for-review), and created a PR template with domain-driven reviewer assignment. Ralph's charter was updated with pre-review and pre-merge gate tables to enforce CI green + MERGEABLE before review and APPROVED + CI still green before merge. Boromir fixed the CI workflow stub to run real dotnet builds, created CODEOWNERS for auto-review routing, and enabled branch protection on main with 1 required review + build check + squash-only merges. Both decisions documented in inbox. diff --git a/.squad/log/2026-04-01T17:15:15Z-ralph-ci-fix.md b/.squad/log/2026-04-01T17:15:15Z-ralph-ci-fix.md deleted file mode 100644 index 8cd683f7..00000000 --- a/.squad/log/2026-04-01T17:15:15Z-ralph-ci-fix.md +++ /dev/null @@ -1,18 +0,0 @@ -# Session: Ralph CI Fix — PR #160 Architecture.Tests - -## Summary -Ralph (work monitor) activated by mpaulosky to scan the board and diagnose CI failure in PR #160. Identified Architecture.Tests failure caused by `AuditLogRepository` missing `IRepository` interface implementation. Local commit `ad6a79f` already contained the fix (added `Repository` base class + explicit `IRepository` interface). Fix pushed to `origin/squad/133-mediatr-admin-handlers`. All 40 pre-push tests passed. - -## Work -- **Activation:** Ralph spawn triggered by mpaulosky for board scan -- **Issue:** PR #160 — Architecture.Tests CI failure on Architecture layer boundaries -- **Root Cause:** `AuditLogRepository` did not implement `IRepository` interface; Architecture tests enforce this boundary -- **Resolution:** Local commit `ad6a79f` already fixed via: - - Added `Repository` base class inheritance - - Explicit `IRepository` interface implementation -- **Action Taken:** Pushed `ad6a79f` to `origin/squad/133-mediatr-admin-handlers` -- **Validation:** All 40 pre-push tests passed successfully - -## Next Steps -- Legolas spawned for issue #136 (/admin/users page scaffold) -- PR #160 CI should now pass on next build diff --git a/.squad/log/2026-04-01T19:49:17Z-blog-catchup-release-notes.md b/.squad/log/2026-04-01T19:49:17Z-blog-catchup-release-notes.md deleted file mode 100644 index 73b5f7e5..00000000 --- a/.squad/log/2026-04-01T19:49:17Z-blog-catchup-release-notes.md +++ /dev/null @@ -1,14 +0,0 @@ -# Session Log — Blog Catchup & Release Notes -**Timestamp:** 2026-04-01T19:49:17Z -**Topic:** Blog catchup and release notes documentation - ---- - -## Agents Deployed -- **Bilbo** (Tech Blogger) — wrote missing v0.3.0 and v0.4.0 release blog posts (commit 246099c) -- **Frodo** (Tech Writer) — added Release Notes section to docs/index.html (commit 5a6f38b) - ---- - -## Outcome -✅ All tasks completed successfully. Blog backlog cleared, release notes now prominently featured in documentation. diff --git a/.squad/log/2026-04-02-process-docs-review.md b/.squad/log/2026-04-02-process-docs-review.md deleted file mode 100644 index 48c56a42..00000000 --- a/.squad/log/2026-04-02-process-docs-review.md +++ /dev/null @@ -1,26 +0,0 @@ -# Session Log — Team Process & Documentation Optimisation -**Date:** 2026-04-02 -**Session type:** Team-wide review - -## Summary - -Conducted full squad process and documentation review after Sprint 5 (Admin User Management) and Sprint 6 (Labels Feature). Four agents worked in parallel. - -## Work Done - -- **Scribe:** decisions.md archived (118 lines removed); decisions-archive.md created; agent histories summarized (Gimli 974→67, Legolas 809→68, Sam 761→70, Gandalf 371→67 lines) -- **Aragorn:** ceremonies.md enhanced (Sprint Review + Issue Grooming); routing.md updated (5 new signals); 2 new skills (auth0-management-api, labels-feature-patterns) -- **Frodo:** Full docs accuracy audit — README, CONTRIBUTING, docs/index.html, docs/blog/index.md — all verified accurate, no changes needed -- **Gandalf:** 3 security routing signals added; auth0-management-security skill created; 1 MEDIUM finding filed (audit log for role assign/revoke) - -## PRs Merged - -- #186 squad/scribe-memory-sweep -- #185 squad/frodo-docs-audit-2026-04-02 -- #183 squad/process-review-2026-04-02 -- #184 squad/gandalf-security-review-2026-04-02 - -## Identity Updates (this session) - -- identity/now.md — updated to v0.6.0 state -- identity/wisdom.md — populated with 10 patterns from 6 sprints diff --git a/.squad/orchestration-log/2025-03-21T15-05-sam.md b/.squad/orchestration-log/2025-03-21T15-05-sam.md deleted file mode 100644 index 9cfb5491..00000000 --- a/.squad/orchestration-log/2025-03-21T15-05-sam.md +++ /dev/null @@ -1,44 +0,0 @@ -# Orchestration Log: Sam (Backend Dev) - -**Timestamp:** 2025-03-21T15:05:00Z -**Agent:** Sam (Backend Developer) -**Task:** Fix MongoDB connection string config mismatch - -## Spawn Context - -**Problem:** Web project crashed with `TimeoutException` connecting to `localhost:27017` instead of Atlas. EF Core MongoDB provider reads `MongoDB:ConnectionString` from appsettings.Development.json (hardcoded to localhost), while Aspire injects the real Atlas connection string into `ConnectionStrings:mongodb`. These config paths never intersect. - -**Scope:** -- `src/Persistence.MongoDb/ServiceCollectionExtensions.cs` — Add fallback logic -- `src/Web/appsettings.Development.json` — Clear localhost default - -## Work Completed - -✅ **Added fallback logic in `AddMongoDbPersistence`:** -1. Check if `MongoDB:ConnectionString` is empty or equals `mongodb://localhost:27017` -2. If so, read `ConnectionStrings:mongodb` and overlay it into MongoDB config section -3. Changed `appsettings.Development.json` to use empty string instead of localhost default - -**Priority order:** -- Explicit `MongoDB:ConnectionString` (non-empty, non-localhost) → used as-is -- Empty/localhost default → falls back to `ConnectionStrings:mongodb` (Aspire-injected or user secrets) - -## Outcome - -✅ **SUCCESS** - -**Result:** -- AppHost runs clean — Aspire injects `ConnectionStrings:mongodb` as env var, fallback picks it up -- Standalone + user secrets works — user secret `ConnectionStrings:mongodb` read as fallback -- Explicit config works — non-empty, non-localhost `MongoDB:ConnectionString` takes priority -- Tests unaffected — `Testing` environment skips `AddMongoDBClient`; tests use TestContainers - -**Files Modified:** -- `src/Persistence.MongoDb/ServiceCollectionExtensions.cs` -- `src/Web/appsettings.Development.json` - -**Pattern Established:** When two config systems disagree (Aspire vs raw appsettings), bridge them at the DI registration layer using configuration overlay before binding Options. - -## Status - -🟢 **Complete** — Ready for merge diff --git a/.squad/orchestration-log/2025-03-29T08-33-36Z-pr86-merged.md b/.squad/orchestration-log/2025-03-29T08-33-36Z-pr86-merged.md deleted file mode 100644 index 9153d223..00000000 --- a/.squad/orchestration-log/2025-03-29T08-33-36Z-pr86-merged.md +++ /dev/null @@ -1,33 +0,0 @@ -# PR #86 Merge Event — Orchestration Log - -**Timestamp:** 2025-03-29T08:33:36Z -**Event:** PR #86 merged into main (squash commit) -**Merge Status:** Complete — all 23 CI checks passed -**E2E Tests:** 40/40 passed - -## Agents Involved -- **Ralph**: Identified 2 failing Aspire+Playwright E2E tests in PR #86 -- **Pippin**: Fixed test startup polling (/health → /alive) and updated theme localStorage key assertions -- **Aragorn**: Resolved dual theme system conflict (removed theme-manager.js, unified to themeManager+tailwind-color-theme) -- **Copilot CLI**: Orchestrated the full session - -## PR Summary -**Title:** fix(web): fix 13 E2E test failures + Issues page bugs + accessibility -**Branch:** squad/86-fix-failing-tests-and-web-razor-pages -**Merge Strategy:** Squash -**Base:** main - -### Changes -- E2E test fixes: polling, theme assertions, health check endpoints -- Theme system unification (removed dual-management conflict) -- Issues page bug fixes -- Accessibility improvements - -## Board Status -✅ **Board is clear** — no blocking issues -✅ **All CI checks passed** (23/23) -✅ **All E2E tests passed** (40/40) - -## Next Steps -- Deployment can proceed -- Session artifacts documented in session log diff --git a/.squad/orchestration-log/2026-03-17T14-30-00Z-aragorn.md b/.squad/orchestration-log/2026-03-17T14-30-00Z-aragorn.md deleted file mode 100644 index f9172995..00000000 --- a/.squad/orchestration-log/2026-03-17T14-30-00Z-aragorn.md +++ /dev/null @@ -1,55 +0,0 @@ -# Orchestration Log: Aragorn - -**Timestamp:** 2026-03-17T14:30:00Z -**Agent:** Aragorn (background, claude-sonnet-4.5) -**Status:** ✅ COMPLETED - ---- - -## Mandate - -Review and commit 94 modified files for formatting cleanup, GlobalUsings reorganization, and line ending normalization. - ---- - -## Execution Summary - -### Work Completed - -1. **Formatting Cleanup (94 files)** - - Applied .editorconfig rules across entire codebase - - Normalized indentation (spaces → tabs where applicable) - - Fixed line ending inconsistencies (CRLF → LF per .editorconfig) - - Trailing whitespace removal - -2. **GlobalUsings Reorganization** - - Centralized `using` statements in `GlobalUsings.cs` files per project - - Removed redundant `using` declarations from source files - - Alphabetized and deduplicated imports - -3. **Line Ending Normalization** - - Applied LF line endings across all text files per .editorconfig - - Ensured charset UTF-8 consistency - -### Staging & Commit - -- **Files Modified:** 94 -- **Branch:** main (local) -- **Commit Message:** Applied .editorconfig formatting rules, reorganized GlobalUsings, normalized line endings -- **Commit Hash:** Created and verified - ---- - -## Outcome - -✅ **All 94 files successfully reviewed, formatted, and committed to local main branch.** - -No blocking issues encountered. Formatting changes are non-functional and improve code consistency across the repository. - ---- - -## Notes for Team - -- Commit is local; await merge confirmation from team lead -- No production code logic changed — purely mechanical cleanup -- .editorconfig rules now enforced across codebase diff --git a/.squad/orchestration-log/2026-03-17T14-30-00Z-gimli.md b/.squad/orchestration-log/2026-03-17T14-30-00Z-gimli.md deleted file mode 100644 index 51214aaf..00000000 --- a/.squad/orchestration-log/2026-03-17T14-30-00Z-gimli.md +++ /dev/null @@ -1,65 +0,0 @@ -# Orchestration Log: Gimli - -**Timestamp:** 2026-03-17T14:30:00Z -**Agent:** Gimli (background, claude-sonnet-4.5) -**Status:** ⚠️ PARTIAL SUCCESS - ---- - -## Mandate - -Diagnose and optimize slow/hanging bUnit test suite (595 tests). Investigate and fix 2 failing delete tests in DetailsPageTests. - ---- - -## Execution Summary - -### Work Completed - -1. **bUnit Test Suite Diagnosis** - - Root cause identified: Tests hang when running full suite together (~2+ minutes) - - Individual test projects run quickly (1-7 seconds) - - Issue traced to BunitContext state conflicts during parallel execution - -2. **Parallelism Configuration** - - Created `tests/Web.Tests.Bunit/xunit.runner.json` - - Configured: `parallelizeTestCollections: false`, `maxParallelThreads: 4` - - Rationale: Reduces resource contention; bUnit test context requires isolated state per test - -3. **Failing Delete Tests Investigation** - - **Failing Tests:** - - `DetailsPageTests.Details_DeleteExecutionNavigatesToIndex` - - `DetailsPageTests.Details_DeleteFailureShowsError` - - **Root Cause:** EventCallback chain in DeleteConfirmationModal not completing - - Modal renders correctly; confirm button detected; EventCallback works in isolation - - **Blocker:** Callback not invoked when modal embedded in Details page - -### Outstanding Issues - -1. **Two Delete Tests Still Failing** - - EventCallback not firing in nested component context - - Requires investigation of: - - bUnit framework limitations with cascading EventCallbacks - - Production code issue in Details page event handling - - Test setup issue with AuthenticationStateProvider state - -2. **Full Suite Execution Still Slow** - - Parallelism config reduces but doesn't eliminate slowness - - Likely root cause: SignalRClientService or resource leak during test disposal - - Workaround: Run tests in smaller groups by filter - ---- - -## Handoff - -✅ **xunit.runner.json created and committed** -⚠️ **Delete tests require further investigation (Legolas in progress)** -⏳ **Full suite optimization deferred pending test fix** - ---- - -## Notes for Team - -- Parallelism config is production-ready and reduces test execution overhead -- Delete test failure may reveal underlying issue causing suite slowness -- Temporary workaround: Filter tests by FullyQualifiedName to run subsets diff --git a/.squad/orchestration-log/2026-03-17T17-26-00Z-sam.md b/.squad/orchestration-log/2026-03-17T17-26-00Z-sam.md deleted file mode 100644 index f6e3a988..00000000 --- a/.squad/orchestration-log/2026-03-17T17-26-00Z-sam.md +++ /dev/null @@ -1,48 +0,0 @@ -# Agent Orchestration Log: Sam - -**Timestamp:** 2026-03-17T17:26:00Z -**Agent:** Sam (Backend Developer) -**Task:** Fix DI lifetime mismatches in ServiceCollectionExtensions.cs and BulkOperationBackgroundService.cs - -## Summary - -Fixed two startup-blocking DI validation failures: - -1. **DbContextFactory lifetime conflict** → Registered factory as scoped to match DbContext options -2. **BackgroundService scoped injection** → Removed unused `INotificationService` field from constructor - -## Outcome - -✅ **SUCCESS** -- Both fixes applied -- Build passes -- Startup validation errors resolved - -## Files Modified - -- `src/Persistence.MongoDb/ServiceCollectionExtensions.cs` -- `src/Web/Services/BulkOperationBackgroundService.cs` - -## Decision - -Decision written to `.squad/decisions/inbox/sam-di-lifetime-fix.md` - -## Rationale - -**Fix 1 (Scoped DbContextFactory):** -- `AddDbContext` registers options as scoped -- `AddDbContextFactory` defaults to singleton -- Singleton cannot consume scoped options → DI validation error -- Solution: Explicitly set `lifetime: ServiceLifetime.Scoped` on factory registration - -**Fix 2 (Remove scoped from singleton):** -- `BulkOperationBackgroundService` is singleton -- Constructor was injecting `INotificationService` (scoped) -- Field was never used in any method -- Service already resolves scoped deps via `IServiceScopeFactory` per-operation -- Solution: Remove unused dependency - -## Team Rules Established - -1. When combining `AddDbContext` + `AddDbContextFactory`, always align lifetimes explicitly -2. Background services (singletons) must never inject scoped services directly — always use `IServiceScopeFactory` diff --git a/.squad/orchestration-log/2026-03-17T18-54-25Z-gandalf.md b/.squad/orchestration-log/2026-03-17T18-54-25Z-gandalf.md deleted file mode 100644 index 0a8fc340..00000000 --- a/.squad/orchestration-log/2026-03-17T18-54-25Z-gandalf.md +++ /dev/null @@ -1,90 +0,0 @@ -# Orchestration: Gandalf — Auth0 Role Claim Mapping (2026-03-17T18:54:25Z) - -**Agent:** Gandalf (Security Officer) -**Model:** claude-sonnet-4.5 -**Mode:** background -**Duration:** Completed - ---- - -## Mission - -Fix Auth0 role-based authorization issue where authenticated users with Admin/User roles received "Access Denied" on protected pages. - ---- - -## Work Completed - -### Root Cause Analysis -- Auth0 sends roles in custom namespaced claim (e.g., `https://issuetracker.com/roles`) -- ASP.NET Core's `RequireRole()` policy checks for standard `ClaimTypes.Role` claim type -- Without mapping, roles exist in JWT but aren't recognized by authorization policies - -### Implementation -1. **Created** `src/Web/Auth/Auth0ClaimsTransformation.cs` - - IClaimsTransformation service - - Maps Auth0 custom role claims to standard ClaimTypes.Role - - Handles multiple role formats: JSON arrays, CSV, single values - - Includes idempotency check and comprehensive logging - -2. **Extended** `src/Web/Auth/Auth0Options.cs` - - Added `RoleClaimNamespace` property (configurable via user secrets) - - Namespace must match Auth0 tenant configuration - -3. **Updated** `src/Web/Program.cs` - - Registered claims transformation as scoped service in auth pipeline - -4. **Updated** `src/Web/appsettings.json` - - Added `RoleClaimNamespace` configuration field with placeholder - ---- - -## Outcome - -✅ **SUCCESS** — Build passes, role-based authorization mechanism now in place. - -### Configuration Required -Developers must set `Auth0:RoleClaimNamespace` in user secrets: -```bash -dotnet user-secrets set "Auth0:RoleClaimNamespace" "https://issuetracker.com/roles" -``` - -### Security Verification -- ✅ No secrets in source code -- ✅ Transformation idempotent (prevents duplicate claims) -- ✅ Audit logging included -- ✅ Only processes authenticated JWT claims - ---- - -## Deliverables - -**Files Created:** -- `.squad/decisions/inbox/gandalf-auth0-role-mapping.md` → merged to decisions.md - -**Files Modified (in src/):** -- `Web/Auth/Auth0ClaimsTransformation.cs` (new) -- `Web/Auth/Auth0Options.cs` (RoleClaimNamespace) -- `Web/Program.cs` (service registration) -- `Web/appsettings.json` (configuration field) - -**Tests:** -- Manual verification with Auth0 test users (pending environment setup) - ---- - -## Related Decisions - -- **Auth0 Authentication Implementation** (2026-03-12): Initial auth setup -- **Auth0 Role Claim Mapping** (2026-03-19): This decision - ---- - -## Team Impact - -**For Sam (Backend):** Claims transformation follows standard ASP.NET Core pattern; integrates cleanly with DI. - -**For Legolas (Frontend):** NavMenuComponent now works with properly mapped roles; authorization policies function as intended. - -**For Matthew (Project Lead):** Configure `Auth0:RoleClaimNamespace` in user secrets to activate role-based access. - diff --git a/.squad/orchestration-log/2026-03-17T18-54-25Z-legolas.md b/.squad/orchestration-log/2026-03-17T18-54-25Z-legolas.md deleted file mode 100644 index b96a12ec..00000000 --- a/.squad/orchestration-log/2026-03-17T18-54-25Z-legolas.md +++ /dev/null @@ -1,91 +0,0 @@ -# Orchestration: Legolas — Navigation Menu & Landing Page (2026-03-17T18:54:25Z) - -**Agent:** Legolas (Frontend Developer) -**Model:** claude-sonnet-4.5 -**Mode:** background -**Duration:** Completed - ---- - -## Mission - -Implement role-based navigation UI and redesign landing page to support authenticated/unauthenticated user states. - ---- - -## Work Completed - -### Navigation Component -1. **Created** `src/Web/Components/Layout/NavMenuComponent.razor` - - Fixed 256px width left sidebar (visible when authenticated) - - Role-based navigation with nested AuthorizeView components - - Separated user-level items (Home, Dashboard, Issues) from admin items (Admin Dashboard, Categories, Statuses, Analytics) - - Emoji icons for visual distinction - - Dark mode support via TailwindCSS - -### Layout Integration -1. **Updated** `src/Web/Components/Layout/MainLayout.razor` - - Integrated NavMenuComponent within AuthorizeView - - Responsive flex layout: header (top) + sidebar (left) + content (right) - - Clean separation of authenticated vs unauthenticated UI - -### Landing Page Redesign -1. **Updated** `src/Web/Components/Pages/Home.razor` - - Dual-state layout: authenticated and unauthenticated views - - Unauthenticated: Welcome message with call-to-action to login - - Authenticated: Brief dashboard preview with quick links - - Proper semantic HTML and accessibility markers - ---- - -## Outcome - -✅ **SUCCESS** — Build passes, navigation and landing page now functional. - -### Features Delivered -- Users can now navigate between authenticated pages -- Clear separation between user and admin features -- Responsive sidebar layout -- Support for future navigation expansion - -### Architecture Quality -- Follows Blazor component conventions -- Uses cascading parameters correctly (avoids context conflicts) -- Authorization policies properly enforced -- No icon library dependencies (emoji-based) - ---- - -## Deliverables - -**Files Created:** -- `.squad/decisions/inbox/legolas-nav-menu.md` → merged to decisions.md -- `src/Web/Components/Layout/NavMenuComponent.razor` (new) - -**Files Modified (in src/):** -- `Web/Components/Layout/MainLayout.razor` (integration) -- `Web/Components/Pages/Home.razor` (dual-state landing) - -**Tests:** -- Build verification passed -- Manual navigation testing in Blazor app - ---- - -## Related Decisions - -- **Navigation Menu Architecture** (2026-03-13): Initial design -- **bUnit Modal Button Selector Pattern** (2026-03-15): Related to component testing - ---- - -## Team Impact - -**For Gandalf (Security):** Navigation respects authorization policies; roles from claims transformation work correctly with menu visibility. - -**For Sam (Backend):** Navigation integrates cleanly with existing authorization policies and DI setup. - -**For Gimli (QA):** Navigation component ready for bUnit test coverage; recommend scoping modal/dialog buttons per established pattern. - -**For Matthew (Project Lead):** Users can now see and navigate authenticated application features. - diff --git a/.squad/orchestration-log/2026-03-18-gimli.md b/.squad/orchestration-log/2026-03-18-gimli.md deleted file mode 100644 index cab7aa0e..00000000 --- a/.squad/orchestration-log/2026-03-18-gimli.md +++ /dev/null @@ -1,33 +0,0 @@ -# Orchestration Log: Gimli (Tester) — Post-PR#57 Improvements - -**Timestamp:** 2026-03-18T13-30-01Z - -## Tasks Completed - -### 1. Test Fixes — 4 Broken Tests -- **File:** `tests/Web.Tests.Bunit/Layout/LayoutComponentTests.cs` - - Fixed: Constructor mismatch in LayoutComponent test setup - -- **File:** `tests/Web.Tests.Bunit/Shared/SharedComponentTests.cs` - - Fixed: CSS class assertions updated from `bg-gray-*` to `bg-primary-*` - - Fixed: SignalR indicator structure assertions (removed `.fixed` and floating card selectors) - - Fixed: SignalR text assertions updated to match inline header component - -### 2. Test Coverage Additions — 9 New Tests -- **File:** `tests/Domain.Tests/Features/Issues/CreateIssueCommandHandlerTests.cs` - - Added 5 new tests for status repository mocking patterns - - Coverage: Default status not found, status found in DB, fallback behavior - -- **File:** `tests/Domain.Tests/Mappers/StatusMapperTests.cs` - - Added 4 new tests for `StatusMapper.ToInfo(Status?)` overload - - Coverage: Null input, valid status mapping, edge cases - -### 3. Test Suite Status -✅ All 1479 tests passing -- 4 broken tests fixed -- 9 new tests added -- No regressions - -## Notes -- bUnit tests now scoped to query theme-aware classes within appropriate component contexts -- Mocking patterns for status repository established as team standard for future CreateIssueCommandHandler tests diff --git a/.squad/orchestration-log/2026-03-18-legolas.md b/.squad/orchestration-log/2026-03-18-legolas.md deleted file mode 100644 index 52b435b5..00000000 --- a/.squad/orchestration-log/2026-03-18-legolas.md +++ /dev/null @@ -1,32 +0,0 @@ -# Orchestration Log: Legolas (Frontend) — Post-PR#57 Improvements - -**Timestamp:** 2026-03-18T13-30-01Z - -## Tasks Completed - -### 1. Theme-Aware Layout Backgrounds -- **Files:** `src/Web/Components/Layout/MainLayout.razor`, `src/Web/Styles/app.css` -- **Change:** Updated MainLayout background from static `bg-gray-50` to `bg-primary-950` (light mode) / `bg-primary-50` (dark mode) -- **Impact:** Layout now responds to selected color theme (blue/red/green/yellow) - -### 2. Header Background Update -- **File:** `src/Web/Components/Layout/MainLayout.razor` -- **Change:** Header uses `bg-primary-900` (light) / `bg-primary-100` (dark) -- **Impact:** Subtle header tint without overwhelming content - -### 3. SignalR Indicator Relocation -- **Files:** `src/Web/Components/Shared/SignalRConnection.razor`, `src/Web/Components/Layout/MainLayout.razor` -- **Change:** Moved `` from fixed bottom-right floating card to inline in header's right-side utility bar (after LoginDisplay) -- **Impact:** Less intrusive, immediately visible, consistent with SaaS UI patterns - -### 4. Dark Mode CSS Update -- **File:** `src/Web/Styles/app.css` -- **Change:** Updated `.dark body` CSS rule to use `var(--color-primary-50)` instead of hardcoded `#111827` -- **Impact:** Dark mode backgrounds now theme-aware - -## Test Status -CSS and layout assertions updated and passing. - -## Notes -- No backend changes required — SignalRConnection still uses same `SignalRClientService` -- Screenshots in documentation may need refresh to show new themed backgrounds diff --git a/.squad/orchestration-log/2026-03-18-sam.md b/.squad/orchestration-log/2026-03-18-sam.md deleted file mode 100644 index cd6f0cdd..00000000 --- a/.squad/orchestration-log/2026-03-18-sam.md +++ /dev/null @@ -1,28 +0,0 @@ -# Orchestration Log: Sam (Backend) — Post-PR#57 Improvements - -**Timestamp:** 2026-03-18T13-30-01Z - -## Tasks Completed - -### 1. Status Repository Injection -- **File:** `src/Domain/Features/Issues/Commands/CreateIssueCommand.cs` -- **Change:** Injected `IRepository` into `CreateIssueCommandHandler` -- **Impact:** Resolved "Open" status from MongoDB instead of hardcoding `ObjectId.Empty` - -### 2. StatusMapper Overload -- **File:** `src/Domain/Mappers/StatusMapper.cs` -- **Change:** Added `StatusMapper.ToInfo(Status?)` overload for direct model-to-value-object conversion -- **Impact:** Enables seamless status mapping in command handlers - -### 3. Test Updates -- **File:** `tests/Domain.Tests/Features/Issues/CreateIssueCommandHandlerTests.cs` -- **File:** `tests/Domain.Tests/Mappers/StatusMapperTests.cs` -- **Change:** Updated test mocking patterns to verify status repository lookup with fallback behavior -- **Status:** All tests passing - -## Build Status -✅ Build clean, no compilation errors. - -## Notes -- Fallback behavior ensures backward compatibility if Status collection is empty -- Requires "Open" status seed data in database for production diff --git a/.squad/orchestration-log/2026-03-19T15-44-51Z-boromir.md b/.squad/orchestration-log/2026-03-19T15-44-51Z-boromir.md deleted file mode 100644 index 57b71088..00000000 --- a/.squad/orchestration-log/2026-03-19T15-44-51Z-boromir.md +++ /dev/null @@ -1,19 +0,0 @@ -# Orchestration Log: Boromir (DevOps) - -**Timestamp:** 2026-03-19T15:44:51Z -**Mode:** background -**Status:** SUCCESS - -## Task -Fix git describe stderr leak in Web.csproj + create v0.1.0 git tag - -## Outcome -- Added `2>/dev/null` to git describe command: `git describe --tags --abbrev=0 2>/dev/null` -- Added `2>/dev/null` to git rev-parse command: `git rev-parse --short HEAD 2>/dev/null` -- Created git tag: `v0.1.0` -- Root cause: stderr contamination in MSBuild ExecWithOutput task was breaking fallback logic - -## Impact -- BuildInfo.g.cs now generates clean build metadata -- Footer displays correct version instead of error text -- Fallback to v0.0.0 works for repos without tags diff --git a/.squad/orchestration-log/2026-03-19T15-44-51Z-gimli.md b/.squad/orchestration-log/2026-03-19T15-44-51Z-gimli.md deleted file mode 100644 index 399ec05d..00000000 --- a/.squad/orchestration-log/2026-03-19T15-44-51Z-gimli.md +++ /dev/null @@ -1,20 +0,0 @@ -# Orchestration Log: Gimli (Tester) - -**Timestamp:** 2026-03-19T15:44:51Z -**Mode:** background -**Status:** SUCCESS - -## Task -Verify BuildInfo.g.cs generation + run FooterComponent tests - -## Outcome -- Clean build passed -- BuildInfo.g.cs generated successfully - - Version: `v0.1.0` - - Commit: `e4874a8` -- All 11 FooterComponent tests passed - -## Impact -- Build metadata generation pipeline verified end-to-end -- Footer component correctly displays generated build info -- No regressions in component test suite diff --git a/.squad/orchestration-log/2026-03-24T14_15_51Z-aragorn.md b/.squad/orchestration-log/2026-03-24T14_15_51Z-aragorn.md deleted file mode 100644 index 8b05f581..00000000 --- a/.squad/orchestration-log/2026-03-24T14_15_51Z-aragorn.md +++ /dev/null @@ -1,22 +0,0 @@ -# Orchestration Log: Aragorn (Lead) - -**Timestamp:** 2026-03-24T14:15:51Z -**Mode:** background -**Task:** Code review of uncommitted changes (50 files) - -## Outcome -**Status:** APPROVED - -## Summary -Reviewed all uncommitted working directory changes spanning 50 files. Changes include NuGet updates, CSS migration (gray-* → neutral-*), ThemeToggle extraction, and test updates. - -## Findings -- ✅ Architecture sound and complete -- ✅ CSS migration verified (zero remaining gray-* references) -- ✅ ThemeToggle extraction follows Blazor patterns -- ✅ Dead CSS cleanup applied -- ⚠️ ACTION REQUIRED: Add .agents/, .claude/, .junie/, skills-lock.json to .gitignore -- ⚠️ DECISION PENDING: docs/research/ disposition - -## Details -Full review in decisions.md diff --git a/.squad/orchestration-log/2026-03-24T14_15_51Z-gimli.md b/.squad/orchestration-log/2026-03-24T14_15_51Z-gimli.md deleted file mode 100644 index de926ce6..00000000 --- a/.squad/orchestration-log/2026-03-24T14_15_51Z-gimli.md +++ /dev/null @@ -1,23 +0,0 @@ -# Orchestration Log: Gimli (Tester) - -**Timestamp:** 2026-03-24T14:15:51Z -**Mode:** background -**Task:** Run full test suite - -## Outcome -**Status:** PASS - -## Summary -Full test suite passed. All 1,477 tests executed successfully across 6 projects. - -## Test Results -Architecture.Tests: 43 PASS -Domain.Tests: 354 PASS -Persistence.AzureStorage.Tests: 33 PASS -Persistence.MongoDb.Tests: 77 PASS -Web.Tests: 348 PASS -Web.Tests.Bunit: 622 PASS -Total: 1,477 PASS - -## Notes -No environment issues. Ready for commit. diff --git a/.squad/orchestration-log/2026-03-27T22-08-46Z-aragorn-pr81-r2.md b/.squad/orchestration-log/2026-03-27T22-08-46Z-aragorn-pr81-r2.md deleted file mode 100644 index b1da09c9..00000000 --- a/.squad/orchestration-log/2026-03-27T22-08-46Z-aragorn-pr81-r2.md +++ /dev/null @@ -1,15 +0,0 @@ -# Orchestration: aragorn-pr81-r2 - -**Agent:** Aragorn (Lead Developer) -**Task:** Lead review of PR #81 -**Status:** REJECTED -**Timestamp:** 2026-03-27T22:08:46Z - -## Blockers - -1. **path**: GitHub Pages artifact path exposes SECRETS.md -2. **squad-docs conflict**: Permissions scope mismatch (workflow vs job level) - -## Next Steps - -Fixes applied by Boromir in PR branch. Awaiting re-review. diff --git a/.squad/orchestration-log/2026-03-27T22-08-47Z-boromir-pr81-r2.md b/.squad/orchestration-log/2026-03-27T22-08-47Z-boromir-pr81-r2.md deleted file mode 100644 index d6c83a58..00000000 --- a/.squad/orchestration-log/2026-03-27T22-08-47Z-boromir-pr81-r2.md +++ /dev/null @@ -1,16 +0,0 @@ -# Orchestration: boromir-pr81-r2 - -**Agent:** Boromir (DevOps) -**Task:** DevOps review of PR #81 -**Status:** REJECTED -**Timestamp:** 2026-03-27T22:08:47Z - -## Blockers - -1. **path**: Artifact path `docs/` required instead of `.` -2. **paths filter**: Workflow trigger paths misconfigured -3. **squad-docs conflict**: Job-level permissions needed, workflow-level removed - -## Resolution - -All blockers resolved in follow-up commit. PR re-approved and merged. diff --git a/.squad/orchestration-log/2026-03-27T22-08-48Z-gandalf-pr81-review.md b/.squad/orchestration-log/2026-03-27T22-08-48Z-gandalf-pr81-review.md deleted file mode 100644 index 6bacefe1..00000000 --- a/.squad/orchestration-log/2026-03-27T22-08-48Z-gandalf-pr81-review.md +++ /dev/null @@ -1,20 +0,0 @@ -# Orchestration: gandalf-pr81-review - -**Agent:** Gandalf (Security) -**Task:** Security review of PR #81 -**Status:** REJECTED -**Timestamp:** 2026-03-27T22:08:48Z - -## Issues - -### HIGH - -- **path exposes SECRETS.md**: GitHub Pages workflow artifact path set to `.` (root), publishing full repository including sensitive files to public endpoint - -### LOW - -- **permissions scope**: Permissions assigned at workflow level instead of job level (defense in depth) - -## Resolution - -Boromir applied fixes: path scoped to `docs/`, permissions moved to job level. PR re-reviewed and approved. diff --git a/.squad/orchestration-log/2026-03-27T22-08-49Z-boromir-pr81-fix.md b/.squad/orchestration-log/2026-03-27T22-08-49Z-boromir-pr81-fix.md deleted file mode 100644 index 2833b105..00000000 --- a/.squad/orchestration-log/2026-03-27T22-08-49Z-boromir-pr81-fix.md +++ /dev/null @@ -1,17 +0,0 @@ -# Orchestration: boromir-pr81-fix - -**Agent:** Boromir (DevOps) -**Task:** Apply all fixes to mpaulosky-patch-1 -**Status:** COMPLETED -**Timestamp:** 2026-03-27T22:08:49Z - -## Fixes Applied - -1. **path → docs**: Changed artifact path from `.` to `docs/` in GitHub Pages workflow -2. **paths filter**: Corrected workflow trigger paths configuration -3. **job-level permissions**: Moved permissions from workflow scope to job scope -4. **squad-docs.yml**: Stripped `pages: write` from workflow-level permissions - -## Result - -All blockers resolved. PR re-approved by Aragorn and Gandalf. Squash-merged to main. diff --git a/.squad/orchestration-log/2026-03-27T22:42:44Z-legolas.md b/.squad/orchestration-log/2026-03-27T22:42:44Z-legolas.md deleted file mode 100644 index 208e9a87..00000000 --- a/.squad/orchestration-log/2026-03-27T22:42:44Z-legolas.md +++ /dev/null @@ -1,31 +0,0 @@ -# Orchestration: Legolas (Frontend Developer) - -**Timestamp:** 2026-03-27T22:42:44Z -**Role:** Frontend Developer -**Status:** ✅ COMPLETE - -## Spawn Tasks - -| Issue | Title | Action | PR | Status | -|-------|-------|--------|----|----| -| #77 | /Account/AccessDenied page missing | Created | #83 | Merged | - -## Work Summary - -Created `src/Web/Components/Pages/Account/AccessDenied.razor`: - -- **Route:** `@page "/Account/AccessDenied"` -- **Layout:** `MainLayout` (consistent with other non-auth pages) -- **Auth:** No `[Authorize]` attribute (user was just denied access) -- **Styling:** Tailwind `neutral-*` palette per charter -- **Copy:** Friendly error message + link to home -- **Impact:** Users denied by Auth0 now see a branded error page instead of NotFound - -## Reviews - -- Approved by: Aragorn, Gandalf -- PR Status: Merged - -## Decision - -Recorded at `.squad/decisions/inbox/legolas-access-denied-77.md`. Context: Auth0 redirects to `/Account/AccessDenied` by convention; app was missing the page, causing 404 UX. diff --git a/.squad/orchestration-log/2026-03-27T22:42:44Z-pippin.md b/.squad/orchestration-log/2026-03-27T22:42:44Z-pippin.md deleted file mode 100644 index 84a703ff..00000000 --- a/.squad/orchestration-log/2026-03-27T22:42:44Z-pippin.md +++ /dev/null @@ -1,30 +0,0 @@ -# Orchestration: Pippin (E2E & Aspire Tester) - -**Timestamp:** 2026-03-27T22:42:44Z -**Role:** E2E & Aspire Tester -**Status:** ✅ COMPLETE - -## Spawn Tasks - -| Issue | Title | Action | PR | Status | -|-------|-------|--------|----|----| -| #78 | TimeoutException not surfaced in WaitForWebReadyAsync | Fixed | #84 | Merged | -| #79 | EnvVarTests must set DisableDashboard = true | Fixed | #84 | Merged | -| #80 | Admin dashboard heading assertion too weak | Fixed | #84 | Merged | - -## Work Summary - -Fixed three test-quality issues in `tests/AppHost.Tests/`: - -1. **#78:** `BasePlaywrightTests.cs` → wrapped polling loop to throw `TimeoutException` instead of `OperationCanceledException` on deadline expiry. -2. **#79:** `EnvVarTests.cs` → added `DisableDashboard = true` config pattern used by `AspireManager.cs`. -3. **#80:** `AdminPageTests.cs` → replaced weak `Should().NotBeNullOrWhiteSpace()` with exact `Should().Be("Admin Dashboard")`. - -## Reviews - -- Approved by: Aragorn, Gimli -- PR Status: Merged - -## Decision - -Recorded at `.squad/decisions/inbox/pippin-test-fixes-78-79-80.md`. Details on each fix's rationale (assertion specificity, env var propagation, exception semantics). diff --git a/.squad/orchestration-log/2026-03-29T14:58:15Z-pippin.md b/.squad/orchestration-log/2026-03-29T14:58:15Z-pippin.md deleted file mode 100644 index 9fa0d6e8..00000000 --- a/.squad/orchestration-log/2026-03-29T14:58:15Z-pippin.md +++ /dev/null @@ -1,21 +0,0 @@ -# Pippin Orchestration Log - -**Timestamp:** 2026-03-29T14:58:15Z -**Agent:** Pippin (Tester E2E & Aspire) -**Mode:** background - -## Outcome -Fixed flaky CI test failures in PR #86 by switching `WaitForWebHealthyAsync` and `WaitForWebReadyAsync` from polling `/health` to `/alive`. - -## Actions Taken -- Identified root cause of Redis timeout in E2E tests -- Updated health-check endpoints to use `/alive` instead of `/health` -- Committed changes to `squad/86-fix-failing-tests-and-web-razor-pages` -- Pushed branch -- Verified build clean - -## Branch -`squad/86-fix-failing-tests-and-web-razor-pages` - -## Status -✅ Complete diff --git a/.squad/orchestration-log/2026-03-29T15-20-55Z-pippin.md b/.squad/orchestration-log/2026-03-29T15-20-55Z-pippin.md deleted file mode 100644 index bf3977f6..00000000 --- a/.squad/orchestration-log/2026-03-29T15-20-55Z-pippin.md +++ /dev/null @@ -1,50 +0,0 @@ -# Orchestration Log: Pippin (Tester) - -**Timestamp:** 2026-03-29T15:20:55Z -**Agent:** Pippin -**Role:** Tester -**Status:** ✅ Complete - -## Outcome - -Fixed ThemeToggleTests and ColorSchemeTests — updated localStorage key assertion from `theme-color-brightness` to `tailwind-color-theme`. - -## Key Findings - -- **Dual theme system conflict discovered** in production code: - - OLD system: `theme.js` + `ThemeProvider.razor.cs` uses key `theme-color-brightness` - - NEW system: `theme-manager.js` + new components use key `tailwind-color-theme` - - Both systems coexist without synchronization → theme preferences don't persist correctly on page reload - -## Actions Taken - -1. Updated test assertions in: - - `tests/AppHost.Tests/Tests/Theme/ThemeToggleTests.cs` (2 tests) - - `tests/AppHost.Tests/Tests/Theme/ColorSchemeTests.cs` (2 tests) -2. Changed all localStorage key checks from `theme-color-brightness` to `tailwind-color-theme` -3. Updated test comments to document the dual system conflict -4. Committed changes: **d7b2b1a** -5. Pushed to origin - -## Production Issue Flagged - -The dual theme system is a **production bug** requiring immediate attention from Aragorn (Backend): -- User theme changes via new components persist to `tailwind-color-theme` -- On page reload, `ThemeProvider` reads from `theme-color-brightness` (stale value) -- Result: Theme preferences don't persist across sessions - -**Recommended Actions (routed to Aragorn):** -- Unify theme persistence to use a single localStorage key -- Ensure all theme components use the same system on page initialization - -## Testing - -- Build: ✅ Succeeded -- Compilation: ✅ No errors -- Full E2E test run: ⏳ Pending Docker/CI validation - ---- - -## Routing - -- **Coordinator Round 2:** Ralph assigned production theme fix to Aragorn for consolidation diff --git a/.squad/orchestration-log/2026-03-29T16:55:42Z-boromir.md b/.squad/orchestration-log/2026-03-29T16:55:42Z-boromir.md deleted file mode 100644 index 9fdf813d..00000000 --- a/.squad/orchestration-log/2026-03-29T16:55:42Z-boromir.md +++ /dev/null @@ -1,21 +0,0 @@ -# Orchestration Log — Boromir (2026-03-29T16:55:42Z) - -**Agent:** Boromir (DevOps) -**Model:** claude-haiku-4.5 -**Mode:** background -**Status:** SUCCESS - -## Summary -Reviewed and merged Dependabot PR #87 — bumped 5 GitHub Actions, all 19 CI checks green, squash-merged to main. - -## Work Completed -- ✅ Reviewed PR #87: "build(deps): Bump the all-actions group with 5 updates" -- ✅ Verified all 19 CI checks passed -- ✅ Squash-merged to main with auto-merge flag -- ✅ Confirmed no regressions or merge conflicts - -## Decision Documented -Decision recorded in `.squad/decisions/inbox/boromir-dependabot-merge.md` for inbox merge. - -## Outcome -PR #87 successfully integrated into main branch. GitHub Actions workflows updated to latest compatible versions with improved CI/CD stability and security. diff --git a/.squad/orchestration-log/2026-03-29T17:03:05Z-legolas.md b/.squad/orchestration-log/2026-03-29T17:03:05Z-legolas.md deleted file mode 100644 index 5c1a3b8b..00000000 --- a/.squad/orchestration-log/2026-03-29T17:03:05Z-legolas.md +++ /dev/null @@ -1,19 +0,0 @@ -# Legolas — Session 2026-03-29T17:03:05Z - -## Task -Footer component text size cleanup. - -## Changes -- Removed `text-xs` class from inner footer div in `src/Web/Components/Layout/FooterComponent.razor` -- Removed invalid `txt-3xl` typo from version/commit links -- All footer text now defaults to `text-base` matching copyright span - -## Status -✅ COMPLETED - -## Files Modified -- `src/Web/Components/Layout/FooterComponent.razor` -- `src/Web/wwwroot/css/app.css` (CSS-related updates) - -## Notes -Footer component now has consistent text sizing across all elements. diff --git a/.squad/orchestration-log/2026-03-29T17:04:58Z-legolas.md b/.squad/orchestration-log/2026-03-29T17:04:58Z-legolas.md deleted file mode 100644 index 34df8892..00000000 --- a/.squad/orchestration-log/2026-03-29T17:04:58Z-legolas.md +++ /dev/null @@ -1,15 +0,0 @@ -# Legolas Session — 2026-03-29T17:04:58Z - -**Role:** Frontend Dev - -## Work Summary - -- **Task:** SignalR connection state labels styling alignment -- **File Modified:** `src/Web/Components/Shared/SignalRConnection.razor` -- **Change:** Removed `text-xs` class from all three state label spans (Live, Connecting, Offline). Labels now inherit `text-base`, matching nav menu link size. -- **Status:** ✅ SUCCESS - -## Details - -Addressed inconsistent label sizing by removing explicit `text-xs` override and allowing components to inherit base text size from parent context. This ensures visual consistency across navigation UI. - diff --git a/.squad/orchestration-log/2026-03-29T18:08:58Z-aragorn.md b/.squad/orchestration-log/2026-03-29T18:08:58Z-aragorn.md deleted file mode 100644 index 1b35e0eb..00000000 --- a/.squad/orchestration-log/2026-03-29T18:08:58Z-aragorn.md +++ /dev/null @@ -1,22 +0,0 @@ -# 2026-03-29T18:08:58Z — Aragorn (Sprint 1) - -## Outcome: COMPLETE ✓ - -### Work -- **Issue #88:** Diagnosed Auth0 role claim type — confirmed namespace requirement -- **Issue #89:** Configuration fix — set `Auth0:RoleClaimNamespace` in appsettings.Development.json -- **Tests:** Reviewed `tests/Web.Tests.Bunit/Auth/Auth0ClaimsTransformationTests.cs` to confirm test constant -- **Decision:** Documented role claim namespace requirement in `.squad/decisions/inbox/aragorn-role-claim-namespace.md` - -### Code Changes -- `src/Web/appsettings.Development.json`: Added Auth0 section with `RoleClaimNamespace = "https://issuetracker.com/roles"` -- Commented on issues #88 and #89 with diagnosis and fix - -### Build Status -- ✓ Build clean -- ✓ Tests passing - -### Notes -- Role claim namespace is critical for Auth0ClaimsTransformation Pass 1 to execute -- Empty namespace cascades to Pass 2 fallback (bare "roles"), but Auth0 uses namespaced claims -- IConfiguration.GetValue("Auth0:RoleClaimNamespace") is the access pattern diff --git a/.squad/orchestration-log/2026-03-29T18:08:58Z-legolas.md b/.squad/orchestration-log/2026-03-29T18:08:58Z-legolas.md deleted file mode 100644 index 55533470..00000000 --- a/.squad/orchestration-log/2026-03-29T18:08:58Z-legolas.md +++ /dev/null @@ -1,33 +0,0 @@ -# 2026-03-29T18:08:58Z — Legolas (Sprint 2+3) - -## Outcome: COMPLETE ✓ - -### Work -- **Issue #91:** Fixed Profile.razor GetAllRoleClaims to include Auth0 namespace claim type -- **Tests:** Added 2 NavMenu bUnit tests + created ProfileRolesTests.cs with 8 comprehensive tests -- **Configuration:** Injected IConfiguration into Profile.razor to read Auth0:RoleClaimNamespace -- **Decision:** Documented Profile.razor role claim fix in `.squad/decisions/inbox/legolas-profile-roles-fix.md` - -### Code Changes -- `src/Web/Components/User/Profile.razor`: - - GetAllRoleClaims() now accepts optional `roleClaimNamespace` parameter - - Includes Auth0 namespace claim type in role lookup - - Injects IConfiguration to read namespace from appsettings - - Belt-and-suspenders: shows roles from Auth0 namespace even if transformation misconfigured -- `tests/Web.Tests.Bunit/Auth/`: - - Added 2 NavMenu bUnit tests covering Admin link visibility -- `tests/Web.Tests.Bunit/Components/User/`: - - Created ProfileRolesTests.cs with 8 tests: - - Roles displayed when present - - No roles message when absent - - Namespace claim type handling - - Standard role claim handling - -### Build Status -- ✓ Build clean -- ✓ All 10 tests passing (2 NavMenu + 8 ProfileRoles) - -### Notes -- Profile component now resilient to transformation failures -- GetAllRoleClaims with namespace parameter supports both standard and Auth0 namespaced claims -- NavMenu tests ensure Admin links visibility is correct based on role claims diff --git a/.squad/orchestration-log/2026-03-29T18:08:58Z-sam.md b/.squad/orchestration-log/2026-03-29T18:08:58Z-sam.md deleted file mode 100644 index 08e07af0..00000000 --- a/.squad/orchestration-log/2026-03-29T18:08:58Z-sam.md +++ /dev/null @@ -1,26 +0,0 @@ -# 2026-03-29T18:08:58Z — Sam (Sprint 2) - -## Outcome: COMPLETE ✓ - -### Work -- **Issue #90:** Added Pass 3 to Auth0ClaimsTransformation — auto-detect claim types ending in `/roles` -- **Tests:** Updated 2 tests in `Auth0ClaimsTransformationTests.cs` -- **Coverage:** Pass 3 now catches misconfigured namespaces and prevents silent failures -- **Decision:** Documented Pass 3 auto-detect logic in `.squad/decisions/inbox/sam-pass3-auto-detect.md` - -### Code Changes -- `src/Web/Auth/Auth0ClaimsTransformation.cs`: - - Added Pass 3 to `TransformAsync()`: scans all claims for types ending in `/roles` when Passes 1 & 2 find nothing - - Belt-and-suspenders safety net for misconfigured namespace -- `tests/Web.Tests.Bunit/Auth/Auth0ClaimsTransformationTests.cs`: - - Added 2 test cases covering Pass 3 auto-detect scenario - - Verified role claim is added to `ClaimTypes.Role` even when namespace is misconfigured - -### Build Status -- ✓ Build clean -- ✓ All Auth0 transformation tests passing - -### Notes -- Pass 3 prevents Admin role hidden in NavMenu when namespace config is missing -- Auto-detect scans all claims ending with `/roles` (case-insensitive) -- Handles both "https://example.com/roles" and custom namespace patterns diff --git a/.squad/orchestration-log/2026-03-29T18:47:42Z-gimli-adminlayout.md b/.squad/orchestration-log/2026-03-29T18:47:42Z-gimli-adminlayout.md deleted file mode 100644 index a14b17bb..00000000 --- a/.squad/orchestration-log/2026-03-29T18:47:42Z-gimli-adminlayout.md +++ /dev/null @@ -1,34 +0,0 @@ -# Orchestration Log — Gimli Sprint 2 - -**Agent:** Gimli (Test Architecture Engineer) -**Timestamp:** 2026-03-29T18:47:42Z -**Task:** Create AdminPageLayout regression tests -**Branch:** squad/90-auth0-claims-pass3-auto-detect - -## Work Completed - -- **File Created:** `tests/Web.Tests.Bunit/Components/Pages/Admin/AdminPageLayoutTests.cs` -- **Test Count:** 14 bUnit tests -- **Test Categories:** - - Component rendering (title, description, child content) - - Navigation link behavior and CSS classes - - Dark mode styling - - Reflection guards: enforce AdminPageLayout **never** inherits `LayoutComponentBase` - - CSS class assertions for Tailwind styling - -- **Key Test:** Reflection guard validates that AdminPageLayout does NOT inherit `LayoutComponentBase`, preventing future bugs where developers accidentally misuse the component as a layout. - -## Build Status -✅ Build clean - -## Test Status -✅ All 14 tests passing - -## Architecture Significance -- Enforces component usage contract: wrapper only, never layout directive -- Prevents regression where AdminPageLayout might be accidentally used with `@layout` directive -- Contributes to overall architecture validation suite - -## Next Steps -- PR review -- Monitor for similar patterns in other wrapper components diff --git a/.squad/orchestration-log/2026-03-29T18:47:42Z-legolas-adminlayout.md b/.squad/orchestration-log/2026-03-29T18:47:42Z-legolas-adminlayout.md deleted file mode 100644 index a4c990da..00000000 --- a/.squad/orchestration-log/2026-03-29T18:47:42Z-legolas-adminlayout.md +++ /dev/null @@ -1,29 +0,0 @@ -# Orchestration Log — Legolas Sprint 2 - -**Agent:** Legolas (UI/Component Engineer) -**Timestamp:** 2026-03-29T18:47:42Z -**Task:** Add warning comment to AdminPageLayout.razor -**Branch:** squad/90-auth0-claims-pass3-auto-detect - -## Work Completed - -- **File Modified:** `src/Web/Components/Pages/Admin/AdminPageLayout.razor` -- **Change:** Added leading comment block warning developers: - ``` - @* ⚠️ COMPONENT WRAPPER — NOT A LAYOUT - Use: ... - Do NOT: @layout AdminPageLayout (this component does NOT inherit LayoutComponentBase) - *@ - ``` -- **Rationale:** AdminPageLayout is a wrapper component, not a Blazor layout. Must be used as `` with parameters, not via `@layout` directive. -- **Impact:** Prevents future misuse and clarifies component intent to other developers. - -## Build Status -✅ Build clean - -## Test Status -✅ All existing tests passing (14 AdminPageLayout bUnit tests by Gimli) - -## Next Steps -- PR review and merge to main -- Consider adding similar guards to other wrapper components diff --git a/.squad/orchestration-log/2026-03-29T21-49-00Z-aragorn.md b/.squad/orchestration-log/2026-03-29T21-49-00Z-aragorn.md deleted file mode 100644 index a79077dc..00000000 --- a/.squad/orchestration-log/2026-03-29T21-49-00Z-aragorn.md +++ /dev/null @@ -1,17 +0,0 @@ -# Aragorn Orchestration — PR Review Process - -**Date:** 2026-03-29T21:49:00Z -**Task:** Implement formal PR review process - -## Deliverables -- ✅ Created `.github/pull_request_template.md` with domain checklist -- ✅ Updated `.squad/ceremonies.md`: 3 new ceremonies (PR Review Gate, CHANGES_REQUESTED, Conflict Resolution) -- ✅ Updated `.squad/routing.md`: 4 new PR state signals -- ✅ Updated `.squad/agents/ralph/charter.md`: Pre-review + pre-merge gate tables -- ✅ Created `.squad/decisions/inbox/aragorn-pr-review-process.md` - -## Outcomes -- PR template drives required reviewers via domain checkboxes -- Review ceremonies define CHANGES_REQUESTED rejection protocol with author lockout -- Ralph gates enforce CI green + MERGEABLE pre-review, APPROVED + CI green pre-merge -- Decision documented for team reference diff --git a/.squad/orchestration-log/2026-03-29T21-49-00Z-boromir.md b/.squad/orchestration-log/2026-03-29T21-49-00Z-boromir.md deleted file mode 100644 index 0acde028..00000000 --- a/.squad/orchestration-log/2026-03-29T21-49-00Z-boromir.md +++ /dev/null @@ -1,17 +0,0 @@ -# Boromir Orchestration — GitHub Infrastructure - -**Date:** 2026-03-29T21:49:00Z -**Task:** Enable GitHub branch protection and CI/CD infrastructure - -## Deliverables -- ✅ Fixed `.github/workflows/squad-ci.yml` (replaced stub with real `dotnet build --configuration Release`) -- ✅ Created `.github/CODEOWNERS` for auto-review routing by file path -- ✅ Enabled branch protection on `main`: 1 required approval, dismiss stale reviews, build check required -- ✅ Enforced squash-only merges + auto-delete branches on merge -- ✅ Created `.squad/decisions/inbox/boromir-github-protection.md` - -## Outcomes -- CI pipeline now validates all PR builds before merge -- CODEOWNERS auto-requests @mpaulosky based on changed files -- Main branch protected with strict merge requirements -- Decision documented for reference and audit trail diff --git a/.squad/orchestration-log/2026-03-29T21:33:13Z-ralph.md b/.squad/orchestration-log/2026-03-29T21:33:13Z-ralph.md deleted file mode 100644 index 0f25557f..00000000 --- a/.squad/orchestration-log/2026-03-29T21:33:13Z-ralph.md +++ /dev/null @@ -1,11 +0,0 @@ -# Ralph Work-Check Cycle — 2026-03-29T21:33:13Z - -**Agent:** Ralph (Work Monitor) - -**Cycle:** 1 - -**Output:** PR #102 ("style: UI polish — nav, footer, SignalR, dashboard cleanup") — all CI checks ✅ green. Merged via squash merge. - -**Board State:** 0 open issues, 0 open PRs. - -**Status:** ✅ Complete diff --git a/.squad/orchestration-log/2026-04-01T17:15:15Z-ralph.md b/.squad/orchestration-log/2026-04-01T17:15:15Z-ralph.md deleted file mode 100644 index 8dd32a9d..00000000 --- a/.squad/orchestration-log/2026-04-01T17:15:15Z-ralph.md +++ /dev/null @@ -1,28 +0,0 @@ -# Orchestration: Ralph - -## Agent Details -- **Name:** Ralph -- **Role:** Work Monitor -- **Mode:** Direct scan + push - -## Why Chosen -Ralph activated as work monitor by mpaulosky to scan the squad board and diagnose CI failures. - -## Work Executed -- **Task:** Board scan for CI issues -- **Issue Found:** PR #160 — Architecture.Tests layer boundary failure -- **Root Cause Diagnosis:** `AuditLogRepository` missing `IRepository` implementation -- **Files Involved:** `src/Domain/Features/Auditing/AuditLogRepository.cs` -- **Fix Source:** Local commit `ad6a79f` (pre-existing, not pushed) -- **Action:** Pushed commit to `origin/squad/133-mediatr-admin-handlers` - -## Test Results -- Pre-push validation: All 40 tests passed - -## Outcome -✅ CI fix deployed -✅ Team visibility improved (fix now in remote) -→ Legolas spawned for issue #136 - -## Spawn -Legolas triggered for issue #136 (/admin/users page scaffold) on branch `squad/136-admin-users-page-scaffold` diff --git a/.squad/orchestration-log/2026-04-01T19:49:17Z-bilbo.md b/.squad/orchestration-log/2026-04-01T19:49:17Z-bilbo.md deleted file mode 100644 index cc67c2b6..00000000 --- a/.squad/orchestration-log/2026-04-01T19:49:17Z-bilbo.md +++ /dev/null @@ -1,28 +0,0 @@ -# Orchestration Log — Bilbo (Tech Blogger) -**Timestamp:** 2026-04-01T19:49:17Z -**Agent:** Bilbo (Tech Blogger) -**Mode:** background -**Status:** ✅ SUCCESS - ---- - -## Task -Catch up on 2 missing mandatory release blog posts (v0.3.0, v0.4.0) - ---- - -## Files Produced -- `docs/blog/2026-04-01-release-v0-3-0.md` — Release blog post for v0.3.0 -- `docs/blog/2026-04-01-release-v0-4-0.md` — Release blog post for v0.4.0 -- `docs/blog/index.md` — Updated blog index -- `docs/index.html` — Updated BLOG table - ---- - -## Outcome -✅ SUCCESS — Committed as **246099c** - ---- - -## Summary -Bilbo successfully authored and published two missing release blog posts covering v0.3.0 and v0.4.0 releases. Blog index and main docs index were updated to reflect new posts. diff --git a/.squad/orchestration-log/2026-04-01T19:49:17Z-frodo.md b/.squad/orchestration-log/2026-04-01T19:49:17Z-frodo.md deleted file mode 100644 index 8eef7a4a..00000000 --- a/.squad/orchestration-log/2026-04-01T19:49:17Z-frodo.md +++ /dev/null @@ -1,25 +0,0 @@ -# Orchestration Log — Frodo (Tech Writer) -**Timestamp:** 2026-04-01T19:49:17Z -**Agent:** Frodo (Tech Writer) -**Mode:** background -**Status:** ✅ SUCCESS - ---- - -## Task -Add Release Notes section to docs/index.html - ---- - -## Files Produced -- `docs/index.html` — Release Notes section added before Dev Blog section with RELEASES_START/RELEASES_END markers; footer updated - ---- - -## Outcome -✅ SUCCESS — Committed as **5a6f38b** - ---- - -## Summary -Frodo successfully structured and added a Release Notes section to the main documentation page with proper markers and footer update. Section placement ensures release information is prominently visible before the Dev Blog section. diff --git a/.squad/orchestration-log/2026-04-02-process-review.md b/.squad/orchestration-log/2026-04-02-process-review.md deleted file mode 100644 index 32586696..00000000 --- a/.squad/orchestration-log/2026-04-02-process-review.md +++ /dev/null @@ -1,25 +0,0 @@ -# Orchestration Log — Process & Docs Review Session -**Date:** 2026-04-02 -**Orchestrator:** Ralph (Project Manager) - -## Agents Spawned - -| Agent | Task | Branch | PR | Status | -|-------|------|--------|----|--------| -| Scribe | Memory sweep — decisions archive + history summarization | squad/scribe-memory-sweep | #186 | ✅ Merged | -| Aragorn | Process review — ceremonies, routing, skills | squad/process-review-2026-04-02 | #183 | ✅ Merged | -| Frodo | Docs audit — README, CONTRIBUTING, XML docs | squad/frodo-docs-audit-2026-04-02 | #185 | ✅ Merged | -| Gandalf | Security review — Auth0 Management, routing signals, history cleanup | squad/gandalf-security-review-2026-04-02 | #184 | ✅ Merged | - -## Changes Merged to Main - -- decisions.md: trimmed 118 pre-2026-02 lines, decisions-archive.md created with 3 entries -- ceremonies.md: Sprint Review + Issue Grooming ceremonies added, Gandalf reviewer row expanded -- routing.md: 8 new routing signals (Admin/Labels/Security domains) -- 3 new skills: auth0-management-api, labels-feature-patterns, auth0-management-security -- Agent histories: Gimli, Legolas, Sam, Gandalf summarized (88% reduction) - -## Outstanding - -- [MEDIUM] Gandalf finding: No audit log for role assign/revoke in UserManagementService — filed in decisions inbox for tracking as follow-up issue -- identity/now.md, identity/wisdom.md — updated in this Scribe pass