Files
Umbraco-CMS/thoughts/shared/handoffs/general/2025-12-14_04-13-01_phase1-publishing-pipeline-sdd.md
yv01p 9962df50ee feat(core): register IContentCrudService in DI container
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>
2025-12-21 03:31:23 +00:00

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
implementation
publishing-pipeline
content-service
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

  1. Implementation Plan: docs/plans/2025-12-14-phase-1-publishing-pipeline-combined-implementation.md
  2. Core CLAUDE.md: src/Umbraco.Core/CLAUDE.md - defines scoping patterns, notification patterns
  3. 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 tests
  • tests/Umbraco.Tests.UnitTests/Umbraco.Core/Services/Publishing/PublishingNotifierTests.cs - 3 unit tests
  • src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Services.cs:92-96 - DI registration
  • src/Umbraco.Core/Services/ContentPublishingService.cs - Added pipeline fields, constructor params, and PerformPublishBranchPipelineAsync method
  • tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Publishing/PublishingPipelineIntegrationTests.cs - 3 integration tests
  • tests/Umbraco.Tests.Benchmarks/ContentPublishingPipelineBenchmarks.cs - Benchmark infrastructure

Learnings

  1. 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
  2. PublishCulture extension method signature: The real method requires PropertyEditorCollection as a parameter, which wasn't in the plan. Had to add this dependency to PublishingExecutor.

  3. RuntimeMoniker for .NET 10: Use RuntimeMoniker.Net10_0 (not Net100 as plan stated)

  4. InternalsVisibleTo already configured: Umbraco.Core.csproj already exposes internals to Umbraco.Infrastructure at line 54.

  5. Constants.Security.SuperUserId = -1: Defined in Constants-Security.cs:11

Artifacts

Implementation Files

  • src/Umbraco.Core/Services/Publishing/IPublishingExecutor.cs
  • src/Umbraco.Core/Services/Publishing/IPublishingNotifier.cs
  • src/Umbraco.Infrastructure/Services/Publishing/PublishingExecutor.cs
  • src/Umbraco.Core/Services/Publishing/PublishingNotifier.cs
  • src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Services.cs:92-96
  • src/Umbraco.Core/Services/ContentPublishingService.cs:32-35,49-52,69-72,383-493

Test Files

  • tests/Umbraco.Tests.UnitTests/Umbraco.Core/Services/Publishing/PublishingExecutorTests.cs
  • tests/Umbraco.Tests.UnitTests/Umbraco.Core/Services/Publishing/PublishingNotifierTests.cs
  • tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Publishing/PublishingPipelineIntegrationTests.cs
  • tests/Umbraco.Tests.Benchmarks/ContentPublishingPipelineBenchmarks.cs

Planning Documents

  • docs/plans/2025-12-14-phase-1-publishing-pipeline-combined-implementation.md

Action Items & Next Steps

  1. Run Task 18 - Full Test Suite:

    dotnet build
    dotnet test tests/Umbraco.Tests.UnitTests --filter "FullyQualifiedName~Publishing"
    dotnet test tests/Umbraco.Tests.UnitTests
    
  2. Code Review for Task 17: Already passed, but was interrupted before marking complete

  3. Update plan document: Mark remaining tasks as completed once verified

  4. Use finishing-a-development-branch skill: After Task 18 passes, follow the skill to complete the branch (merge, PR, or cleanup options)

  5. 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 IDocumentRepository instead of IContentService (avoids circular dependencies)
  • PerformPublishBranchPipelineAsync runs in PARALLEL with legacy path (not replacing it)
  • All components registered as Scoped services (appropriate for transaction-based operations)