Adds IContentCrudService registration to UmbracoBuilder alongside IContentService. Both services are now resolvable from DI. Includes integration test verifying successful resolution. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
7.0 KiB
date, researcher, git_commit, branch, repository, topic, tags, status, last_updated, last_updated_by, type
| date | researcher | git_commit | branch | repository | topic | tags | status | last_updated | last_updated_by | type | ||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2025-12-14T04:13:01+00:00 | Claude | 99b50eaca4bbac78d83f894a06b58e255a73d2dc | refactor/ContentService | Umbraco-CMS | Phase 1 Publishing Pipeline Implementation using Subagent-Driven Development |
|
in_progress | 2025-12-14 | Claude | implementation_strategy |
Handoff: Phase 1 Publishing Pipeline - Subagent-Driven Development
Task(s)
Implementing Phase 1 of the publishing pipeline refactoring using the subagent-driven-development skill. This creates four internal pipeline components (Strategy, Validator, Executor, Notifier) for branch publishing using repository-based architecture.
Plan document: docs/plans/2025-12-14-phase-1-publishing-pipeline-combined-implementation.md
Status Summary
| Task | Description | Status |
|---|---|---|
| Task 1-7 | Supporting types & first interfaces | COMPLETED (before session) |
| Task 8 | IPublishingExecutor interface | COMPLETED |
| Task 9 | IPublishingNotifier interface | COMPLETED |
| Task 10-11 | PublishingStrategy & PublishingValidator implementations | COMPLETED (before session) |
| Task 12 | PublishingExecutor with IDocumentRepository | COMPLETED |
| Task 13 | PublishingNotifier implementation | COMPLETED |
| Task 14 | Register pipeline components in DI | COMPLETED |
| Task 15 | Add PerformPublishBranchPipelineAsync method | COMPLETED |
| Task 16 | Create integration tests | COMPLETED |
| Task 17 | Create benchmark infrastructure | COMPLETED |
| Task 18 | Run full test suite | PENDING |
Current Phase: Task 18 (final verification) - need to run full test suite
Critical References
- Implementation Plan:
docs/plans/2025-12-14-phase-1-publishing-pipeline-combined-implementation.md - Core CLAUDE.md:
src/Umbraco.Core/CLAUDE.md- defines scoping patterns, notification patterns - superpowers:subagent-driven-development skill - workflow being followed
Recent changes
All changes committed to refactor/ContentService branch:
src/Umbraco.Core/Services/Publishing/IPublishingExecutor.cs- Added interface (Task 8)src/Umbraco.Core/Services/Publishing/IPublishingNotifier.cs- Added interface (Task 9)src/Umbraco.Infrastructure/Services/Publishing/PublishingExecutor.cs- Implementation with IDocumentRepository (Task 12)src/Umbraco.Core/Services/Publishing/PublishingNotifier.cs- Implementation (Task 13)tests/Umbraco.Tests.UnitTests/Umbraco.Core/Services/Publishing/PublishingExecutorTests.cs- 4 unit teststests/Umbraco.Tests.UnitTests/Umbraco.Core/Services/Publishing/PublishingNotifierTests.cs- 3 unit testssrc/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Services.cs:92-96- DI registrationsrc/Umbraco.Core/Services/ContentPublishingService.cs- Added pipeline fields, constructor params, and PerformPublishBranchPipelineAsync methodtests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Publishing/PublishingPipelineIntegrationTests.cs- 3 integration teststests/Umbraco.Tests.Benchmarks/ContentPublishingPipelineBenchmarks.cs- Benchmark infrastructure
Learnings
-
ContentValidationResult naming collision: There are two types with this name in the codebase:
Umbraco.Cms.Core.Models.ContentEditing.ContentValidationResult(existing)Umbraco.Cms.Core.Services.Publishing.ContentValidationResult(new pipeline type)- Fixed by using fully qualified names in
ContentPublishingService.cs:199,251,278
-
PublishCulture extension method signature: The real method requires
PropertyEditorCollectionas a parameter, which wasn't in the plan. Had to add this dependency toPublishingExecutor. -
RuntimeMoniker for .NET 10: Use
RuntimeMoniker.Net10_0(notNet100as plan stated) -
InternalsVisibleTo already configured:
Umbraco.Core.csprojalready exposes internals toUmbraco.Infrastructureat line 54. -
Constants.Security.SuperUserId = -1: Defined in
Constants-Security.cs:11
Artifacts
Implementation Files
src/Umbraco.Core/Services/Publishing/IPublishingExecutor.cssrc/Umbraco.Core/Services/Publishing/IPublishingNotifier.cssrc/Umbraco.Infrastructure/Services/Publishing/PublishingExecutor.cssrc/Umbraco.Core/Services/Publishing/PublishingNotifier.cssrc/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Services.cs:92-96src/Umbraco.Core/Services/ContentPublishingService.cs:32-35,49-52,69-72,383-493
Test Files
tests/Umbraco.Tests.UnitTests/Umbraco.Core/Services/Publishing/PublishingExecutorTests.cstests/Umbraco.Tests.UnitTests/Umbraco.Core/Services/Publishing/PublishingNotifierTests.cstests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Publishing/PublishingPipelineIntegrationTests.cstests/Umbraco.Tests.Benchmarks/ContentPublishingPipelineBenchmarks.cs
Planning Documents
docs/plans/2025-12-14-phase-1-publishing-pipeline-combined-implementation.md
Action Items & Next Steps
-
Run Task 18 - Full Test Suite:
dotnet build dotnet test tests/Umbraco.Tests.UnitTests --filter "FullyQualifiedName~Publishing" dotnet test tests/Umbraco.Tests.UnitTests -
Code Review for Task 17: Already passed, but was interrupted before marking complete
-
Update plan document: Mark remaining tasks as completed once verified
-
Use finishing-a-development-branch skill: After Task 18 passes, follow the skill to complete the branch (merge, PR, or cleanup options)
-
Performance baseline: After full verification, run the benchmark to establish baseline:
dotnet run -c Release --project tests/Umbraco.Tests.Benchmarks -- --filter "*PublishingPipeline*"
Other Notes
Commits Made (most recent first)
99b50eaca4- perf(benchmarks): add publishing pipeline benchmark infrastructure (Task 17)4d898b10d0- test(integration): add publishing pipeline integration tests (Task 16)a9adbdf3f9- feat(core): add PerformPublishBranchPipelineAsync method (Task 15)d532c657f9- chore(di): register publishing pipeline components (Task 14)80b141d2dd- feat(core): implement PublishingNotifier (Task 13)e7d546f2b6- feat(core): implement PublishingExecutor with IDocumentRepository (Task 12)85a90b2b93- feat(core): add IPublishingNotifier interface (Task 9)75bb8ff8f7- feat(core): add IPublishingExecutor interface (Task 8)
Performance Gates (from plan)
- Throughput (50+ items): >= 2x improvement over legacy
- Memory allocations: <= legacy
- Correctness: 100% parity with existing tests
Key Architecture Decisions
- Pipeline components are
internal(not public API yet) - Uses
IDocumentRepositoryinstead ofIContentService(avoids circular dependencies) PerformPublishBranchPipelineAsyncruns in PARALLEL with legacy path (not replacing it)- All components registered as Scoped services (appropriate for transaction-based operations)