Skip to content

chore: promote dev → main (v1.1.0) — Sprint 4 Release - #106

Merged
mpaulosky merged 74 commits into
mainfrom
squad/105-promote-dev-main
Apr 24, 2026
Merged

chore: promote dev → main (v1.1.0) — Sprint 4 Release#106
mpaulosky merged 74 commits into
mainfrom
squad/105-promote-dev-main

Conversation

@mpaulosky

Copy link
Copy Markdown
Owner

Sprint 4 Release — v1.1.0

Replaces PR #105 which had a merge conflict in workflow files (squad-ci.yml, squad-test.yml).

Changes included

All Sprint 4 work from dev:

Conflict resolution

squad-ci.yml and squad-test.yml had add/add and content conflicts from main having an older version. Resolved by accepting the dev versions (correct current state).


Closes #105

After merging, run squad-milestone-release to tag and publish v1.1.0.

mpaulosky and others added 30 commits April 20, 2026 09:07
## Summary

Adds `sprint/**` to the CI trigger in `squad-test.yml`.

**Changes:**
- New `push` trigger for `sprint/**` — so direct pushes to sprint
consolidation branches run the parallel test suite
- Added `sprint/**` to `pull_request.branches` — so PRs *targeting*
sprint branches (e.g. squad/* → sprint/*) also trigger CI

**Branch flow:** `squad/*` → `sprint/*` → `dev` → `main`

Sprint branches are consolidation checkpoints. Without this fix,
sprint-level PRs ran with zero remote validation.

Closes #69

Working as Boromir (DevOps/Infra)

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Gate: Aragorn ✅ APPROVE (pre-push hook fix ready to merge)## Summary

<!-- Describe what this PR does and why. Link the issue it closes. -->

Closes #<!-- issue number -->

## Type of Change

<!-- Check all that apply -->

- [ ] 🐛 Bug fix (non-breaking change that fixes an issue)
- [ ] ✨ Feature (non-breaking change that adds functionality)
- [ ] ♻️ Refactor (no behavior change, code cleanup/restructure)
- [ ] 🧪 Tests (new or updated tests only)
- [ ] 📝 Docs (README, XML docs, comments)
- [ ] ⚙️ Infra/CI (GitHub Actions, Aspire, NuGet, deployment)
- [ ] 🔒 Security (auth, permissions, secrets, headers)
- [ ] 💥 Breaking change (existing behavior changes)

## Domain Affected

<!-- Check all that apply — this determines which reviewers are required
-->

- [ ] 🏗️ Architecture / domain logic / CQRS → **Aragorn required**
- [ ] 🔧 Backend (handlers, repositories, API endpoints, MediatR) → **Sam
required**
- [ ] ⚛️ Frontend (Blazor components, Razor pages, CSS, JS) → **Legolas
required**
- [ ] 🧪 Unit / bUnit / integration tests → **Gimli required**
- [ ] 🧪 E2E / Playwright / Aspire integration tests → **Pippin
required**
- [ ] ⚙️ CI/CD / GitHub Actions / NuGet / Aspire AppHost → **Boromir
required**
- [ ] 🔒 Auth0 / authorization / security-relevant changes → **Gandalf
required**
- [ ] 📝 Docs / README / XML docs → **Frodo required**

## Self-Review Checklist

<!-- Complete before requesting review — incomplete PRs will be returned
-->

### Code Quality
- [ ] I ran `dotnet build MyBlog.slnx --configuration Release` — 0
errors, 0 warnings
- [ ] I ran `dotnet test MyBlog.slnx --configuration Release --no-build`
— all pass
- [ ] No TODO/FIXME left unless tracked in a follow-up issue (link it)
- [ ] No secrets, API keys, or credentials committed

### Architecture
- [ ] New handlers follow the `Command`/`Query`/`Handler`/`Validator`
naming conventions
- [ ] New handlers are `sealed`
- [ ] Domain layer has no references to `Web` or `Persistence.*`
projects
- [ ] `Result<T>` / `ResultErrorCode` used for expected failures (no
exception-driven control flow)
- [ ] DTOs are records in `Domain.DTOs`; Models are in `Domain.Models`
- [ ] No DTO types embedded in Model classes

### Tests
- [ ] New code has corresponding unit tests
- [ ] Integration tests use domain-specific collections
(`[Collection("XxxIntegration")]`)
- [ ] No test compares two `IssueDto.Empty` / `CommentDto.Empty`
instances directly

### Security (check if security-relevant)
- [ ] New endpoints have appropriate `RequireAuthorization` / policy
applied
- [ ] No `MarkupString` used with user-supplied content
- [ ] No user input reflected in MongoDB queries without sanitization

### Merge Readiness
- [ ] Branch is up to date with `main` (no merge conflicts)
- [ ] CI checks are green (do not request review while checks are
pending/failing)
- [ ] PR description is complete — reviewers should not have to ask what
this does

## Screenshots / Evidence

<!-- For UI changes: before/after screenshots. For fixes: evidence the
bug is resolved. -->

## Notes for Reviewers

<!-- Anything you want reviewers to pay special attention to, or context
they need. -->

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary

Closes #76

Working as Boromir (DevOps / Infra)

The existing `project-board-automation.yml` only moves items between
columns — it never added new issues or PRs to the board in the first
place. This PR fills that gap with two dedicated workflows.

## Changes

### `add-issues-to-project.yml`
- Triggers on `issues: [opened, reopened]`
- Filters to issues labelled `squad` (avoids noise from unrelated
issues)
- Adds the issue to the MyBlog project board via GraphQL
`addProjectV2ItemById`
- Sets the **Status** field → **Backlog** (`f75ad846`)
- Handles 403 errors gracefully with a hint to use a PAT with `project`
scope

### `add-prs-to-project.yml`
- Triggers on `pull_request: [opened, reopened]`
- Adds every new PR to the MyBlog project board
- Sets the **Status** field → **In Review** (`df73e18b`)
- Handles 403 errors gracefully

## Project IDs used
| Key | Value |
|-----|-------|
| PROJECT_ID | `PVT_kwHOA5k0b84BVFTy` |
| STATUS_FIELD_ID | `PVTSSF_lAHOA5k0b84BVFTyzhQjgPk` |
| BACKLOG_OPTION_ID | `f75ad846` |
| IN_REVIEW_OPTION_ID | `df73e18b` |

## Notes
Both workflows use `secrets.GITHUB_TOKEN`. If GitHub's fine-grained
token restrictions block project writes (403), a PAT with the `project`
scope stored as `secrets.GH_PROJECT_TOKEN` can be substituted.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Architecture test results → architecture-test-results artifact
- Unit test results → unit-test-results artifact
- Integration test results → integration-test-results artifact
- All uploads use if: always() for fault tolerance
- 30-day retention for cost-balancing

Closes #73
…msHelper fixes (#79)

feat(#59): Add Profile page, RoleClaimsHelper, and UI component tests

Profile page:
- Displays user info (name, email, roles)
- Admin badge (red) in header
- Role badges: Admin=red, others=green
- Responsive Tailwind + DaisyUI layout

RoleClaimsHelper:
- Extract role claims from ClaimsPrincipal
- Handle Auth0 and standard claim types
- Performance optimization (return string[] vs IReadOnlyList)

Tests (6 RoleClaimsHelper + 3 Profile):
- Role extraction coverage (empty, Auth0, standard, mixed claims)
- Badge rendering and styling validation
- All tests passing, coverage gate met

Closes #59
…* branches (#78)

Update pre-push Gate 0 documentation to reflect sprint/* branch support (already implemented in PR #62)

Closes #61
E2E tests with Aspire integration, CI hardening, fixture fixes.
…learnings

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
GitVersion auto-increments on main; v1.0.0-sprint3 is final sprint tag.
Subsequent releases follow pure semantic versioning from v1.0.1 onwards.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
When CI runs on main after merge, create and push the git tag based on
GitVersion-determined semver. This enables v1.0.1, v1.0.2, etc. to be
automatically tagged without manual intervention.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
GitVersion v4 action no longer accepts 'useConfigFile'. Use 'configFilePath'
to explicitly specify the GitVersion.yml location.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The 'Create and Push Git Tag' step requires 'contents: write' permission
to push tags to the repository.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
semVer includes pre-release height on non-main branches, resulting in tags like
v1.0.0-101. On main, we want clean semver tags like v1.0.1, which comes from
the majorMinorPatch output.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Document the new automatic versioning workflow with GitVersion.
This is the first commit after v1.0.0, which will trigger v1.0.1 tag creation.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Aligns with squad naming conventions and PRD specification.
All squad-managed workflows use the 'squad-' prefix.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Boromir and others added 22 commits April 22, 2026 10:02
The AppHost.Tests requires MongoDB and Redis Docker containers to be started
during test execution. On CI, these images need to be pulled from the registry,
which was timing out during the test. Pre-pulling images ensures they are
available before the test starts, preventing 'Connection reset by peer' errors.
The squad-ci.yml was running tests in addition to squad-test.yml, causing
duplicate test execution. This workflow should only perform build operations
(mirrors the pre-push gate build phase). Test execution is handled by
squad-test.yml which runs on squad/** and sprint/** branches.

Fixes: build-and-test check failure on PR #98
The Web application was throwing InvalidOperationException during AppHost.Tests
startup because Auth0 configuration was required but not provided in CI.

Solution:
- Move Auth0 validation check to production environment only
- In Development mode (used by Aspire E2E tests), use mock/test Auth0 values
- Update appsettings.Development.json with test credentials

This allows the web app to start successfully in the Aspire test environment
without requiring real Auth0 credentials, while maintaining security in production
where Auth0 is properly configured via user secrets.

Fixes: AppHost.Tests 'Connection reset by peer' failure (PR #98)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Move Playwright E2E tests from legacy E2E structure to new AppHost.Tests layout
- Extract infrastructure utilities (AspireManager, PlaywrightManager) into separate classes
- Organize E2E tests by feature area (Admin, Layout, Pages, Theme)
- Rename E2E test files for clarity (WebPlaywrightTests, EnvVarTests, etc.)
- Add *.lscache to gitignore to ignore IDE cache files
- Update AppHost.Tests project file to reference new test structure

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Centralize all NuGet package versions in Directory.Packages.props:
- Created Directory.Packages.props with 30 unique package versions
- Enabled ManagePackageVersionsCentrally in Directory.Build.props
- Removed Version attributes from all PackageReference entries
- All 10 .csproj files updated to use centralized versions

Benefits:
- Single source of truth for all NuGet package versions
- Easier to audit and update dependencies
- Reduces duplication across project files
- Follows .NET best practices (SDK 10+)

Build verified: Release build completes successfully
- Add Version attributes to all PackageReference items
- Uses versions consistent with other test projects:
  - Aspire.Hosting.Testing 13.2.3
  - FluentAssertions 8.9.0
  - Microsoft.Playwright 1.48.0
  - coverlet.collector 10.0.0
  - Microsoft.NET.Test.Sdk 18.5.0
  - xunit 2.9.3
  - xunit.runner.visualstudio 3.1.5

Fixes: NuGet error NU1015 during CI build

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Remove Version attributes from all PackageReference items
- Packages are managed centrally via Directory.Packages.props
- Fixes NU1008 error: Central Package Management must define versions centrally

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CI cold-start takes longer than expected; increase timeout to 180 seconds
to allow sufficient time for Aspire to provision containers and start the
web app, even with Docker images pre-pulled.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The Web app was checking only IsDevelopment() to use mock Auth0 values,
but E2E tests run in Testing environment. This caused app startup to fail
with 'Auth0 configuration is missing or incomplete' error.

Update check to include both Development and Testing environments,
allowing mock Auth0 values to be used in both contexts.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…gs__mongodb

The AppHost creates a MongoDB database resource named 'myblog', so the
generated connection string environment variable is ConnectionStrings__myblog,
not ConnectionStrings__mongodb.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…config handling

**Problem:**
E2E tests were timing out during AspireManager.StartAppAsync() because:
1. The /alive endpoint was only mapped in Development environment, not Testing
2. Auth0 configuration was receiving empty strings instead of null, causing ArgumentException

**Solution:**
1. Updated ServiceDefaults/Extensions.cs to map /alive and /health endpoints for Testing environment
2. Changed Web/Program.cs Auth0 config to use IsNullOrWhiteSpace() instead of IsNullOrEmpty()
3. Use direct assignment instead of null coalescing (??=) to ensure fallback values are applied
4. Added detailed logging to AspireManager for troubleshooting startup issues

**Result:**
- Web app now starts successfully in Testing environment
- Health checks are properly accessible at /alive
- AspireManager can verify app readiness before tests run
- All infrastructure E2E tests can now proceed
- Logging helps diagnose future startup issues

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…h runs in CI

- Updated Web.csproj: Added GenerateBlazorAssets MSBuild target to run after build (Release only)
- Target runs dotnet publish and copies _framework files to bin output
- This ensures blazor.web.js and component JS files are available for AppHost.Tests
- Added explicit publish step in squad-test.yml before AppHost.Tests runs
- Fixes: FileNotFoundException for _framework/blazor.web.js in E2E tests

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Updated GenerateBlazorAssets target to copy files to both bin and src/Web/wwwroot
- When Aspire runs 'dotnet run' from project directory, it looks for wwwroot in source location
- Ensures blazor.web.js and component JS files are available for dotnet run execution

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Removed IssueTracker-specific test files (Dashboard, Admin, Issues pages)
- Removed Theme and Admin layout tests (not applicable to MyBlog)
- Updated HomePageTests assertions to match MyBlog's actual content
- Updated Layout tests to remove IssueTracker brand/footer text expectations
- Simplified NavMenu tests for MyBlog's actual page structure

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Remove orphaned build artifacts from src/Web/wwwroot (stale JS/CSS files, _framework directory, compressed .br/.gz variants)
- Remove GenerateBlazorAssets target from Web.csproj that was causing duplicate asset conflicts in .NET 10 SDK
- Add .gitignore rules to prevent future accumulation of build artifacts: _framework/, *.br, *.gz
- Clean wwwroot directory and allow Blazor build system to regenerate assets on demand

This fixes the BLAZOR106 error and 'Sequence contains more than one element' SDK error that was blocking Release builds on squad/80 branch.

Fixes #99

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Closes #96

- Fix 7 flaky E2E tests: remove hard-coded 5000ms timeouts, use
  IsNullOrWhiteSpace in test login endpoint
- Add ThemeSelector and fix Home href="/" in mobile hamburger menu
  (functional regression from Aragorn review)
- Rename Layout_NavMenu_IsHiddenWhenNotAuthenticated to accurately
  reflect the assertion
- Fix Playwright strict mode violations: use specific selectors to
  distinguish desktop vs mobile duplicate elements

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Resolves the VSA violation where CQRS handlers/commands/validators lived in Domain.

- Deleted src/Domain/Features/ (13 files)
- Deleted tests/Domain.Tests/ (superseded by Web.Tests)
- Web/Program.cs: MediatR/FluentValidation now scan Web assembly only
- Architecture.Tests: added Domain_Should_Not_Have_Features guard
- Web.Tests: updated namespaces to MyBlog.Web.Features.* after move
- AppHost.Tests: resolved all 70 build warnings

Closes #103
Merge dev into main for Sprint 4 release. Resolve workflow conflicts
by accepting dev versions (squad-ci.yml, squad-test.yml).
Also fix squad-preview validate to exclude AppHost.Tests/Bunit.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings April 24, 2026 00:20
@github-actions github-actions Bot added the squad Squad triage inbox — Lead will assign to a member label Apr 24, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🏗️ PR Added to Squad Triage Queue

This PR has been labeled with squad and added to the triage queue.

Next steps:

  • The squad Lead will review and assign to an appropriate team member
  • A squad:member label will be added after triage

If you know which squad member should handle this, you can add the appropriate squad:member label yourself.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results Summary

201 tests   201 ✅  14s ⏱️
  5 suites    0 💤
  5 files      0 ❌

Results for commit 5f57e8b.

@codecov

codecov Bot commented Apr 24, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 87.03704% with 7 lines in your changes missing coverage. Please review.
⚠️ Please upload report for BASE (main@5a2bddb). Learn more about missing BASE report.

Files with missing lines Patch % Lines
src/Web/Components/Theme/ThemeSelector.razor 42.85% 2 Missing and 2 partials ⚠️
src/Web/Components/Theme/ThemeProvider.razor.cs 91.30% 2 Missing ⚠️
...Components/Theme/ThemeColorDropdownComponent.razor 75.00% 0 Missing and 1 partial ⚠️
Additional details and impacted files
@@           Coverage Diff           @@
##             main     #106   +/-   ##
=======================================
  Coverage        ?   78.19%           
=======================================
  Files           ?       40           
  Lines           ?      642           
  Branches        ?      107           
=======================================
  Hits            ?      502           
  Misses          ?       95           
  Partials        ?       45           
Files with missing lines Coverage Δ
src/Domain/Abstractions/Result.cs 81.25% <100.00%> (ø)
src/Domain/Behaviors/ValidationBehavior.cs 100.00% <ø> (ø)
src/Web/Components/Layout/MainLayout.razor 100.00% <ø> (ø)
src/Web/Components/Layout/NavMenu.razor 75.00% <100.00%> (ø)
...ponents/Theme/ThemeBrightnessToggleComponent.razor 100.00% <100.00%> (ø)
src/Web/Components/Theme/ThemeProvider.razor 100.00% <100.00%> (ø)
...Features/BlogPosts/Create/CreateBlogPostCommand.cs 100.00% <ø> (ø)
...Features/BlogPosts/Create/CreateBlogPostHandler.cs 100.00% <ø> (ø)
...Features/BlogPosts/Delete/DeleteBlogPostCommand.cs 100.00% <ø> (ø)
...Features/BlogPosts/Delete/DeleteBlogPostHandler.cs 100.00% <ø> (ø)
... and 16 more
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@mpaulosky
mpaulosky merged commit 578cf40 into main Apr 24, 2026
19 checks passed
@mpaulosky
mpaulosky deleted the squad/105-promote-dev-main branch April 24, 2026 00:25

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

Release promotion PR merging dev into main for Sprint 4 / v1.1.0, bringing in the new Blazor theme system, test-suite reorganization (unit/bUnit/integration/AppHost E2E), and CI/CD + build infrastructure updates (including Central Package Management).

Changes:

  • Introduces a Blazor theme system (OKLCH palettes + ThemeProvider/ThemeSelector) and updates layout/components to use it.
  • Reorganizes and expands test projects (Web unit tests, bUnit tests, integration tests, and Playwright/Aspire AppHost E2E).
  • Updates build/CI infrastructure (CPM via Directory.Packages.props, workflow additions/updates, pre-push gate updates).

Reviewed changes

Copilot reviewed 144 out of 146 changed files in this pull request and generated 12 comments.

Show a summary per file
File Description
tests/Web.Tests/Web.Tests.csproj Adds Web unit test project under new structure.
tests/Web.Tests/Security/RoleClaimsHelperTests.cs Updates namespaces + expands RoleClaimsHelper tests.
tests/Web.Tests/ResultTests.cs Adjusts namespace/imports for Result tests.
tests/Web.Tests/Handlers/GetBlogPostsHandlerTests.cs Updates test namespace after reorg.
tests/Web.Tests/Handlers/EditBlogPostHandlerTests.cs Updates namespace + strengthens NSubstitute argument match.
tests/Web.Tests/Handlers/DeleteBlogPostHandlerTests.cs Updates namespace/imports for handler tests.
tests/Web.Tests/Handlers/CreateBlogPostHandlerTests.cs Updates namespace for handler tests.
tests/Web.Tests/GlobalUsings.cs Adds global usings for Web.Tests.
tests/Web.Tests/Features/BlogPosts/Commands/UpdateBlogPostCommandValidatorTests.cs Adds validator tests (but currently mismatched naming/validator).
tests/Web.Tests/Features/BlogPosts/Commands/EditBlogPostCommandValidatorTests.cs Updates namespace for validator tests.
tests/Web.Tests/Features/BlogPosts/Commands/DeleteBlogPostDomainCommandValidatorTests.cs Adds delete-command validator tests.
tests/Web.Tests/Features/BlogPosts/Commands/DeleteBlogPostCommandValidatorTests.cs Updates namespace for validator tests.
tests/Web.Tests/Features/BlogPosts/Commands/CreateBlogPostDomainCommandValidatorTests.cs Adds create-command validator tests.
tests/Web.Tests/Features/BlogPosts/Commands/CreateBlogPostCommandValidatorTests.cs Updates namespace for validator tests.
tests/Web.Tests/BlogPostTests.cs Updates namespace for entity tests.
tests/Web.Tests/Behaviors/ValidationBehaviorTests.cs Updates namespace/imports for pipeline behavior tests.
tests/Web.Tests.Integration/xunit.runner.json Adds xUnit runner config for integration tests.
tests/Web.Tests.Integration/Web.Tests.Integration.csproj Adds new integration test project.
tests/Web.Tests.Integration/IntegrationTest1.cs Adds scaffold integration test placeholder.
tests/Web.Tests.Integration/Infrastructure/MongoDbFixture.cs Moves/renames fixture + formatting fixes.
tests/Web.Tests.Integration/Infrastructure/BlogPostIntegrationCollection.cs Updates namespace/formatting for collection fixture.
tests/Web.Tests.Integration/GlobalUsings.cs Updates integration test global usings + project name.
tests/Web.Tests.Integration/BlogPosts/MongoDbBlogPostRepositoryTests.cs Updates namespaces/usings + formatting.
tests/Web.Tests.Bunit/Web.Tests.Bunit.csproj Adds new bUnit test project.
tests/Web.Tests.Bunit/Testing/TestAuthorizationService.cs Updates namespace + project header.
tests/Web.Tests.Bunit/GlobalUsings.cs Updates global usings (removes stale Domain.Abstractions global).
tests/Web.Tests.Bunit/Features/ProfileTests.cs Updates namespace + adds role badge styling assertions.
tests/Web.Tests.Bunit/Components/Theme/ThemeProviderTests.cs Adds ThemeProvider bUnit tests for JS interop + state behavior.
tests/Web.Tests.Bunit/Components/RazorSmokeTests.cs Updates namespaces/usings + adds footer role assertion.
tests/Web.Tests.Bunit/Components/Layout/NavMenuTests.cs Updates to render ThemeProvider wrapper and adds header/brand link assertions.
tests/Unit.Tests/Unit.Tests.csproj Removes old combined Unit.Tests project.
tests/Unit.Tests/Domain/Queries/GetBlogPostByIdQueryHandlerTests.cs Removes old Domain.Features handler tests.
tests/Unit.Tests/Domain/Queries/GetAllBlogPostsQueryHandlerTests.cs Removes old Domain.Features handler tests.
tests/Unit.Tests/Domain/Commands/UpdateBlogPostCommandHandlerTests.cs Removes old Domain.Features handler tests.
tests/Unit.Tests/Domain/Commands/DeleteBlogPostCommandHandlerTests.cs Removes old Domain.Features handler tests.
tests/Unit.Tests/Domain/Commands/CreateBlogPostCommandHandlerTests.cs Removes old Domain.Features handler tests.
tests/Integration.Tests/IntegrationTest1.cs Removes old Integration.Tests scaffold.
tests/Integration.Tests/Integration.Tests.csproj Removes old Integration.Tests project (replaced by Web.Tests.Integration).
tests/Architecture.Tests/ThemeLayerTests.cs Adds architecture rules for Theme component namespace/dependencies.
tests/Architecture.Tests/DomainLayerTests.cs Adds guard asserting Domain has no Features namespace.
tests/Architecture.Tests/Architecture.Tests.csproj Updates project metadata + CPM-friendly PackageReferences.
tests/AppHost.Tests/WebPlaywrightTests.cs Adds Playwright smoke tests for web resource.
tests/AppHost.Tests/Tests/Pages/NotFoundPageTests.cs Adds E2E tests for 404 page.
tests/AppHost.Tests/Tests/Pages/HomePageTests.cs Adds E2E tests for home page guest/auth views.
tests/AppHost.Tests/Tests/Layout/LayoutAuthenticatedTests.cs Adds authenticated layout E2E tests.
tests/AppHost.Tests/Tests/Layout/LayoutAnonymousTests.cs Adds anonymous layout E2E tests.
tests/AppHost.Tests/Infrastructure/PlaywrightManager.cs Adds shared Playwright browser lifecycle manager.
tests/AppHost.Tests/Infrastructure/AspireManager.cs Adds Aspire fixture to start AppHost + enforce Testing env + health polling.
tests/AppHost.Tests/Infrastructure/AppHostTestCollection.cs Adds xUnit collection fixture for shared AspireManager.
tests/AppHost.Tests/EnvVarTests.cs Adds env var resolution tests for Aspire web resource.
tests/AppHost.Tests/BasePlaywrightTests.cs Adds Playwright base class with health polling + auth helpers.
tests/AppHost.Tests/AppHost.Tests.csproj Adds AppHost E2E test project.
src/Web/appsettings.Development.json Sets Auth0 test values in Development config.
src/Web/Web.csproj Moves to CPM references + adjusts publish/build properties.
src/Web/Styles/themes.css Adds OKLCH theme palettes (CSS vars).
src/Web/Styles/input.css Adds Tailwind v4 input + tokens + component layer styles.
src/Web/Security/RoleClaimsHelper.cs Improves null handling + internal role-claim type computation.
src/Web/Program.cs Makes Auth0 required only in Production; adds /test/login endpoint; limits MediatR/validators to Web assembly.
src/Web/GlobalUsings.cs Removes stale global using for Domain.Abstractions.
src/Web/Features/UserManagement/UserManagementHandler.cs Adds MyBlog.Domain.Abstractions import after namespace changes.
src/Web/Features/UserManagement/RemoveRoleCommand.cs Adds MyBlog.Domain.Abstractions import.
src/Web/Features/UserManagement/Profile.razor Adds Admin badges and role styling; tracks _isAdmin.
src/Web/Features/UserManagement/GetUsersWithRolesQuery.cs Adds MyBlog.Domain.Abstractions import.
src/Web/Features/UserManagement/GetAvailableRolesQuery.cs Adds MyBlog.Domain.Abstractions import.
src/Web/Features/UserManagement/AssignRoleCommand.cs Adds MyBlog.Domain.Abstractions import.
src/Web/Features/BlogPosts/List/Index.razor Updates ResultErrorCode namespace reference.
src/Web/Features/BlogPosts/List/GetBlogPostsQuery.cs Adds MyBlog.Domain.Abstractions import.
src/Web/Features/BlogPosts/List/GetBlogPostsHandler.cs Adds MyBlog.Domain.Abstractions import.
src/Web/Features/BlogPosts/Edit/GetBlogPostByIdQuery.cs Adds MyBlog.Domain.Abstractions import.
src/Web/Features/BlogPosts/Edit/EditBlogPostHandler.cs Adds MyBlog.Domain.Abstractions import.
src/Web/Features/BlogPosts/Edit/EditBlogPostCommand.cs Adds MyBlog.Domain.Abstractions import.
src/Web/Features/BlogPosts/Edit/Edit.razor Updates ResultErrorCode namespace reference.
src/Web/Features/BlogPosts/Delete/DeleteBlogPostHandler.cs Adds MyBlog.Domain.Abstractions import.
src/Web/Features/BlogPosts/Delete/DeleteBlogPostCommand.cs Adds MyBlog.Domain.Abstractions import.
src/Web/Features/BlogPosts/Create/CreateBlogPostHandler.cs Adds MyBlog.Domain.Abstractions import.
src/Web/Features/BlogPosts/Create/CreateBlogPostCommand.cs Adds MyBlog.Domain.Abstractions import.
src/Web/Components/_Imports.razor Adds Theme components namespace import.
src/Web/Components/Theme/ThemeSelector.razor Adds ThemeSelector wrapper component.
src/Web/Components/Theme/ThemeProvider.razor.cs Adds ThemeProvider code-behind with JS interop + cascading state.
src/Web/Components/Theme/ThemeProvider.razor Adds cascading values for theme state/provider.
src/Web/Components/Theme/ThemeColorDropdownComponent.razor Adds color dropdown component (accessible select).
src/Web/Components/Theme/ThemeBrightnessToggleComponent.razor Adds brightness toggle button component with SVG icons.
src/Web/Components/Layout/NavMenu.razor Refactors NavMenu: header landmark + ThemeSelector usage + consistent auth URLs.
src/Web/Components/Layout/MainLayout.razor Adds role="contentinfo" to footer.
src/Web/Components/App.razor Wraps routes with ThemeProvider + sets interactive render mode.
src/ServiceDefaults/ServiceDefaults.csproj Moves package refs to CPM style.
src/ServiceDefaults/Extensions.cs Moves namespace to MyBlog.ServiceDefaults; maps endpoints in Development/Testing; adds code coverage exclusion.
src/Domain/Features/BlogPosts/Queries/GetBlogPostById/GetBlogPostByIdQueryHandler.cs Removes Domain.Features CQRS handler (migrated to Web).
src/Domain/Features/BlogPosts/Queries/GetBlogPostById/GetBlogPostByIdQuery.cs Removes Domain.Features CQRS query (migrated to Web).
src/Domain/Features/BlogPosts/Queries/GetAllBlogPosts/GetAllBlogPostsQueryHandler.cs Removes Domain.Features CQRS handler (migrated to Web).
src/Domain/Features/BlogPosts/Queries/GetAllBlogPosts/GetAllBlogPostsQuery.cs Removes Domain.Features CQRS query (migrated to Web).
src/Domain/Features/BlogPosts/Commands/UpdateBlogPost/UpdateBlogPostCommandValidator.cs Removes Domain.Features validator (migrated to Web).
src/Domain/Features/BlogPosts/Commands/UpdateBlogPost/UpdateBlogPostCommandHandler.cs Removes Domain.Features handler (migrated to Web).
src/Domain/Features/BlogPosts/Commands/UpdateBlogPost/UpdateBlogPostCommand.cs Removes Domain.Features command (migrated to Web).
src/Domain/Features/BlogPosts/Commands/DeleteBlogPost/DeleteBlogPostCommandValidator.cs Removes Domain.Features validator (migrated to Web).
src/Domain/Features/BlogPosts/Commands/DeleteBlogPost/DeleteBlogPostCommandHandler.cs Removes Domain.Features handler (migrated to Web).
src/Domain/Features/BlogPosts/Commands/DeleteBlogPost/DeleteBlogPostCommand.cs Removes Domain.Features command (migrated to Web).
src/Domain/Features/BlogPosts/Commands/CreateBlogPost/CreateBlogPostCommandValidator.cs Removes Domain.Features validator (migrated to Web).
src/Domain/Features/BlogPosts/Commands/CreateBlogPost/CreateBlogPostCommandHandler.cs Removes Domain.Features handler (migrated to Web).
src/Domain/Features/BlogPosts/Commands/CreateBlogPost/CreateBlogPostCommand.cs Removes Domain.Features command (migrated to Web).
src/Domain/Domain.csproj Moves package refs to CPM style.
src/Domain/Behaviors/ValidationBehavior.cs Updates Result namespace import to MyBlog.Domain.Abstractions.
src/Domain/Abstractions/Result.cs Renames namespace to MyBlog.Domain.Abstractions + simplifies Fail overload usage.
src/AppHost/AppHost.csproj Moves Aspire package refs to CPM style.
src/AppHost/AppHost.cs Adds partial Program excluded from code coverage.
scripts/install-hooks.sh Updates branch naming gate messaging (but still references old test paths).
package.json Updates Tailwind CLI input to src/Web/Styles/input.css.
docs/blazor-web-app-starter-template-prd.md Renames IssueTracker references to MyBlog in PRD text.
docs/TESTING.md Adds testing guide doc (currently non-compliant with repo markdown rules).
docs/ARCHITECTURE.md Updates architecture doc sections (some statements now inconsistent with code).
MyBlog.slnx Updates solution to include new test projects and AppHost.Tests; removes old ones.
MyBlog.sln.DotSettings Adds Rider/ReSharper dictionary settings.
Directory.Packages.props Introduces Central Package Management (CPM) versions.
Directory.Build.props Adds analyzer/code-style build settings and LangVersion latest.
.squad/infrastructure-fix-summary.md Adds internal infra fix summary (currently non-compliant markdown).
.squad/decisions/DELETED-ASSETS.md Renames legacy playbook reference to MyBlog.
.squad/decisions.md Updates decisions text and references to renamed playbook.
.squad/agents/pippin/history.md Updates history references to renamed playbook.
.squad/agents/boromir/history.md Adds sprint branch flow notes.
.squad/agents/aragorn/history.md Updates references to renamed playbook.
.squad/.ralph-state.json Adds initial Ralph state file.
.gitignore Ignores logs/coverage outputs and Blazor build artifacts.
.github/workflows/sync-readme.yml Adds workflow to sync root README into docs copy.
.github/workflows/static.yml Adds GitHub Pages deployment for docs/blog/.
.github/workflows/squad-release.yml Adds tag-based release workflow (currently references removed test project).
.github/workflows/squad-promote.yml Adds workflow to open/refresh dev→main promotion PRs.
.github/workflows/squad-preview.yml Adds dev-branch validation workflow.
.github/workflows/squad-milestone-release.yml Adds workflow to cut/push release tags + create release.
.github/workflows/squad-insider-release.yml Adds insider branch pre-release flow (currently references removed test project).
.github/workflows/squad-docs.yml Adds optional docs build workflow scaffold.
.github/workflows/squad-ci.yml Simplifies CI to build-only and adjusts triggers.
.github/workflows/release-blog.yml Creates Bilbo blog-brief issues on GitHub Release publish.
.github/workflows/milestone-release-decision.yml Automates release-vs-blog path based on Ralph’s labels.
.github/workflows/milestone-blog.yml Creates Ralph review issue when milestone closes.
.github/workflows/code-metrics.yml Adds automated .NET code metrics workflow.
.github/workflows/blog-readme-sync.yml Syncs docs/blog index “recent posts” into README section.
.github/workflows/add-prs-to-project.yml Auto-adds PRs to project board.
.github/workflows/add-issues-to-project.yml Auto-adds squad-labeled issues to project board.
.github/skills/squad-finalize/SKILL.md Adds squad-finalize skill doc (currently uses H1).
.github/hooks/pre-push Updates test gate paths (currently references non-existent Domain.Tests).
.github/extensions/squad-finalize/extension.mjs Adds Copilot extension implementing squad-finalize automation.
Comments suppressed due to low confidence (1)

scripts/install-hooks.sh:68

  • The printed gate descriptions still reference tests/Unit.Tests and tests/Integration.Tests, but this PR removes those projects and replaces them with tests/Web.Tests*. Update these messages to match the actual pre-push hook projects to avoid misleading contributors.

Comment on lines +113 to +115
<ThemeProvider>
<Routes @rendermode="InteractiveServer" />
</ThemeProvider>

Copilot AI Apr 24, 2026

Copy link

Choose a reason for hiding this comment

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

ThemeProvider is rendered outside the interactive render-mode boundary, so its cascading values and JS interop won’t participate in the interactive component tree. This likely leaves ThemeSelector without a provider and breaks theme changes at runtime. Apply the render mode to ThemeProvider (or otherwise ensure it’s inside the same interactive subtree as Routes).

Copilot uses AI. Check for mistakes.
Comment thread src/Web/Program.cs
Comment on lines +166 to +170
// Test-only login endpoint for E2E testing (Development/Testing environments only)
if (app.Environment.IsDevelopment() || app.Environment.IsEnvironment("Testing"))
{
app.MapGet("/test/login", MapTestLoginEndpoint).AllowAnonymous();
}

Copilot AI Apr 24, 2026

Copy link

Choose a reason for hiding this comment

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

The /test/login endpoint is enabled for Development as well as Testing and performs an anonymous sign-in. If a dev instance is reachable outside localhost, this becomes an auth bypass. Consider restricting this endpoint to the Testing environment only, or require an additional guard (e.g., local-only check, secret header, or compile-time DEBUG).

Copilot uses AI. Check for mistakes.
Comment thread .github/hooks/pre-push
Comment on lines 89 to 94
TEST_PROJECTS=(
"tests/Architecture.Tests/Architecture.Tests.csproj"
"tests/Unit.Tests/Unit.Tests.csproj"
"tests/Domain.Tests/Domain.Tests.csproj"
"tests/Web.Tests/Web.Tests.csproj"
"tests/Web.Tests.Bunit/Web.Tests.Bunit.csproj"
)

Copilot AI Apr 24, 2026

Copy link

Choose a reason for hiding this comment

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

tests/Domain.Tests/Domain.Tests.csproj is referenced in Gate 3 but that project does not exist (tests folder contains AppHost.Tests, Architecture.Tests, Web.Tests, Web.Tests.Bunit, Web.Tests.Integration). This will make the pre-push hook fail for everyone. Remove or replace this entry with the correct test project(s).

Copilot uses AI. Check for mistakes.
Comment on lines +47 to +53
dotnet test tests/Unit.Tests/Unit.Tests.csproj --configuration Release --no-build --no-restore \
--logger "trx;LogFileName=domain-results.trx"
dotnet test tests/Unit.Tests/Unit.Tests.csproj --configuration Release --no-build --no-restore \
--logger "trx;LogFileName=web-results.trx"
dotnet test tests/Architecture.Tests --configuration Release --no-build --no-restore \
--logger "trx;LogFileName=arch-results.trx"
dotnet test tests/Unit.Tests/Unit.Tests.csproj --configuration Release --no-build --no-restore \

Copilot AI Apr 24, 2026

Copy link

Choose a reason for hiding this comment

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

The workflow runs dotnet test tests/Unit.Tests/Unit.Tests.csproj, but that project is deleted in this PR. This will break the release pipeline on tag push. Update the test commands to run the current test projects (e.g., tests/Web.Tests, tests/Web.Tests.Bunit, tests/Web.Tests.Integration, plus tests/Architecture.Tests).

Suggested change
dotnet test tests/Unit.Tests/Unit.Tests.csproj --configuration Release --no-build --no-restore \
--logger "trx;LogFileName=domain-results.trx"
dotnet test tests/Unit.Tests/Unit.Tests.csproj --configuration Release --no-build --no-restore \
--logger "trx;LogFileName=web-results.trx"
dotnet test tests/Architecture.Tests --configuration Release --no-build --no-restore \
--logger "trx;LogFileName=arch-results.trx"
dotnet test tests/Unit.Tests/Unit.Tests.csproj --configuration Release --no-build --no-restore \
dotnet test tests/Web.Tests --configuration Release --no-build --no-restore \
--logger "trx;LogFileName=domain-results.trx"
dotnet test tests/Web.Tests.Integration --configuration Release --no-build --no-restore \
--logger "trx;LogFileName=web-results.trx"
dotnet test tests/Architecture.Tests --configuration Release --no-build --no-restore \
--logger "trx;LogFileName=arch-results.trx"
dotnet test tests/Web.Tests.Bunit --configuration Release --no-build --no-restore \

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +6
# E2E Test Infrastructure Fix - AppHost.Tests Aspire Timeout Resolution

**Date:** 2026-04-23
**Status:** ✅ RESOLVED
**Branch:** squad/80-reorganize-test-projects
**Commit:** 89fd3dc

Copilot AI Apr 24, 2026

Copy link

Choose a reason for hiding this comment

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

This markdown file appears to be missing required YAML front matter and begins with an H1, which violates the repo markdown validation rules applied to **/*.md. Add the required front matter and change the top heading to H2+ so CI/doc validation doesn’t fail.

Copilot uses AI. Check for mistakes.
Comment on lines +49 to +61
public async Task SetColor(string color)
{
CurrentColor = color;
StateHasChanged();
await Js.InvokeVoidAsync("themeManager.setColor", color);
}

public async Task SetBrightness(string brightness)
{
CurrentBrightness = brightness;
StateHasChanged();
await Js.InvokeVoidAsync("themeManager.setBrightness", brightness);
}

Copilot AI Apr 24, 2026

Copy link

Choose a reason for hiding this comment

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

SetColor/SetBrightness call JS interop without handling exceptions. If JS is unavailable or localStorage is blocked, the exception will propagate and can break the Blazor circuit on user interaction. Consider catching JSException (and/or TaskCanceledException) similarly to OnAfterRenderAsync, and only updating state after a successful JS call (or fallback gracefully).

Copilot uses AI. Check for mistakes.
Comment on lines +47 to +50
dotnet test tests/Unit.Tests/Unit.Tests.csproj --configuration Release --no-build --no-restore
dotnet test tests/Unit.Tests/Unit.Tests.csproj --configuration Release --no-build --no-restore
dotnet test tests/Architecture.Tests --configuration Release --no-build --no-restore
dotnet test tests/Unit.Tests/Unit.Tests.csproj --configuration Release --no-build --no-restore

Copilot AI Apr 24, 2026

Copy link

Choose a reason for hiding this comment

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

The workflow still runs dotnet test tests/Unit.Tests/Unit.Tests.csproj, which is removed in this PR. This will break insider release runs. Update the test commands to target the current test projects (Web.Tests / Web.Tests.Bunit / Web.Tests.Integration / Architecture.Tests).

Suggested change
dotnet test tests/Unit.Tests/Unit.Tests.csproj --configuration Release --no-build --no-restore
dotnet test tests/Unit.Tests/Unit.Tests.csproj --configuration Release --no-build --no-restore
dotnet test tests/Architecture.Tests --configuration Release --no-build --no-restore
dotnet test tests/Unit.Tests/Unit.Tests.csproj --configuration Release --no-build --no-restore
dotnet test tests/Web.Tests --configuration Release --no-build --no-restore
dotnet test tests/Web.Tests.Bunit --configuration Release --no-build --no-restore
dotnet test tests/Web.Tests.Integration --configuration Release --no-build --no-restore
dotnet test tests/Architecture.Tests --configuration Release --no-build --no-restore

Copilot uses AI. Check for mistakes.
Comment thread docs/TESTING.md
Comment on lines +1 to +6
# Testing Guide

This document covers the testing strategy, test projects, and code coverage requirements for IssueTrackerApp.

## Test Projects

Copilot AI Apr 24, 2026

Copy link

Choose a reason for hiding this comment

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

This doc violates the repo markdown rules: it starts with an H1 and has no YAML front matter, which the validators enforce for **/*.md. Also, the intro references IssueTrackerApp (not MyBlog) and includes outdated test project names/solution path. Add the required front matter and change the heading level (start at H2), then update the content to match MyBlog’s test projects.

Copilot uses AI. Check for mistakes.
Comment on lines +7 to +45
# Squad Finalize Skill

Automate the squad branch workflow: review changes, stage, commit, push, create PR, clean up, and sync with dev.

## Workflow

### 1. Validate Context
- Check current branch is not `main` or `dev` (safety check)
- Verify git is available and we're in a repository
- Confirm user is ready to proceed

### 2. Review Changes
- Run `git diff --stat` to show summary of changes
- Present changes to user for review
- Ask user to confirm proceeding

### 3. Stage and Commit
- Run `git add -A` to stage all changes
- Generate commit message from branch name (e.g., `squad/80-reorganize-test-projects` → `Reorganize Test Projects`)
- Allow user to provide custom commit message if desired
- Run `git commit -m "<message>"` with co-author trailer

### 4. Push to Remote
- Run `git push -u origin <current-branch>`
- Wait for push to complete
- Report success or failure

### 5. Create Pull Request
- Run `gh pr create --base dev --head <current-branch> --title "<commit-message>" --body "Automated squad workflow PR"`
- Extract PR URL from output
- Report PR creation success
- If PR already exists, fetch and display existing PR URL

### 6. Cleanup
- Ask user if they want to delete the local branch (default: yes)
- If confirmed, run `git branch -D <current-branch>`
- Report branch deletion

### 7. Sync with Dev

Copilot AI Apr 24, 2026

Copy link

Choose a reason for hiding this comment

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

Markdown validators require no H1 headings (start at H2) even when YAML front matter is present. # Squad Finalize Skill will fail validation. Change it to ## and adjust subsequent heading levels accordingly.

Suggested change
# Squad Finalize Skill
Automate the squad branch workflow: review changes, stage, commit, push, create PR, clean up, and sync with dev.
## Workflow
### 1. Validate Context
- Check current branch is not `main` or `dev` (safety check)
- Verify git is available and we're in a repository
- Confirm user is ready to proceed
### 2. Review Changes
- Run `git diff --stat` to show summary of changes
- Present changes to user for review
- Ask user to confirm proceeding
### 3. Stage and Commit
- Run `git add -A` to stage all changes
- Generate commit message from branch name (e.g., `squad/80-reorganize-test-projects``Reorganize Test Projects`)
- Allow user to provide custom commit message if desired
- Run `git commit -m "<message>"` with co-author trailer
### 4. Push to Remote
- Run `git push -u origin <current-branch>`
- Wait for push to complete
- Report success or failure
### 5. Create Pull Request
- Run `gh pr create --base dev --head <current-branch> --title "<commit-message>" --body "Automated squad workflow PR"`
- Extract PR URL from output
- Report PR creation success
- If PR already exists, fetch and display existing PR URL
### 6. Cleanup
- Ask user if they want to delete the local branch (default: yes)
- If confirmed, run `git branch -D <current-branch>`
- Report branch deletion
### 7. Sync with Dev
## Squad Finalize Skill
Automate the squad branch workflow: review changes, stage, commit, push, create PR, clean up, and sync with dev.
### Workflow
#### 1. Validate Context
- Check current branch is not `main` or `dev` (safety check)
- Verify git is available and we're in a repository
- Confirm user is ready to proceed
#### 2. Review Changes
- Run `git diff --stat` to show summary of changes
- Present changes to user for review
- Ask user to confirm proceeding
#### 3. Stage and Commit
- Run `git add -A` to stage all changes
- Generate commit message from branch name (e.g., `squad/80-reorganize-test-projects``Reorganize Test Projects`)
- Allow user to provide custom commit message if desired
- Run `git commit -m "<message>"` with co-author trailer
#### 4. Push to Remote
- Run `git push -u origin <current-branch>`
- Wait for push to complete
- Report success or failure
#### 5. Create Pull Request
- Run `gh pr create --base dev --head <current-branch> --title "<commit-message>" --body "Automated squad workflow PR"`
- Extract PR URL from output
- Report PR creation success
- If PR already exists, fetch and display existing PR URL
#### 6. Cleanup
- Ask user if they want to delete the local branch (default: yes)
- If confirmed, run `git branch -D <current-branch>`
- Report branch deletion
#### 7. Sync with Dev

Copilot uses AI. Check for mistakes.
Comment on lines +16 to +19
public class UpdateBlogPostCommandValidatorTests
{
private readonly EditBlogPostCommandValidator _validator = new();

Copilot AI Apr 24, 2026

Copy link

Choose a reason for hiding this comment

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

Test name doesn’t match the validator under test: UpdateBlogPostCommandValidatorTests instantiates EditBlogPostCommandValidator and uses EditBlogPostCommand. Rename the test class/file (or switch the validator) so the intent is clear and consistent.

Copilot generated this review using guidance from repository custom instructions.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

squad Squad triage inbox — Lead will assign to a member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants