Skip to content

Migrate Catalog (Categories/Services/Tags) to Result errors; remove Services; physical reorg - #75

Merged
evertonschuster merged 2 commits into
mainfrom
pr/03-catalog-category-foundation-v2
Aug 2, 2026
Merged

Migrate Catalog (Categories/Services/Tags) to Result errors; remove Services; physical reorg#75
evertonschuster merged 2 commits into
mainfrom
pr/03-catalog-category-foundation-v2

Conversation

@evertonschuster

Copy link
Copy Markdown
Owner

Summary

Split out of #69 (part 3 — see that PR for the full picture). Replaces #72, which was built stacked on #71's now-merged branch; this repo's convention (and the split-large-coderabbit-pr skill) calls for a sequential series instead — CodeRabbit also doesn't review PRs whose base isn't the default branch, so stacking silently skipped review for #72. This PR is the same content, re-based on main now that #70 and #71 are merged. No functional change from #72.

This PR is larger than the <100-file target the other PRs in this series hit — deliberately, see "Why this couldn't be split further" below.

  • Categories, Services, and Tags all move to the Result-based error convention docs/adr/014 establishes: domain entities' create() methods, mappers, and API repositories return Result<T, AppError> instead of throwing; useAsync.ts (already Result-based, landed in Migrate Auth to Result-based error handling; add shared Result/error infra #71) is the one hook every feature's data layer builds on now.
  • app/composition/container.ts's CatalogFacade drops the use-case-class indirection (ListCategories/CreateTag/etc. as separate classes) for direct repository delegation ({ execute: repo.method }) — there's no orchestration between the facade and the repository, so the extra class per operation wasn't earning its keep. The 24 now-orphaned use-case-class files (application/use-cases/{categories,services,tags}/) are deleted.
  • Services' frontend implementation (ServicesPage, ServiceForm, six ServicesPage.*.test.tsx files, all its components/hooks/models) is fully removed, reverting /services to a placeholder page (app/pages/ServicesPage/ServicesPage.tsx) — this vertical goes back to stub status, see docs/STATUS.md.
  • Categories moves to a routed create/edit dialog (features/catalog/presentation/categories/pages/CategoriesListPage/, .../CategoryEditorDialog/) per docs/adr/012, replacing the old flat CategoriesPage.tsx/useCategories.ts/CategoryEditorDialog.tsx shape.
  • Tags gets the equivalent internal move (hooks/useTagEditor.ts, pages/TagEditorDialog.tsx) and its own Result migration (Tag.ts/tagMapper.ts/ApiTagRepository.ts) — Tags itself is not being removed here, just migrated; its removal is the next PR in this series (docs/adr/016).
  • shared/: AuthenticatedHttpClient's get/post/put/delete now return Result<T, AppError> instead of throwing; DeleteConfirmationDialog takes entityName/entityType instead of a raw title/description pair; useCreateInline is removed (no longer used once Services — its only consumer — is gone).

Why this couldn't be split further

I initially tried a narrower "Category-only foundation" PR (~99 files) deferring Services/Tags. That failed a real build: app/composition/container.ts wires TagRepository with its new method signature directly (tagRepository.listAll(options) instead of the old (tenantContext, options) two-arg form) — not just a return-type change useAsync-style, but the interface itself. Making that build without also migrating TagRepository/ApiTagRepository/tagMapper/Tag.ts for real isn't a smaller wrapper shim — it's the same size of work as just finishing the migration, since there's no reduced version of an interface signature. Categories, Services, and Tags share container.ts's catalog wiring, router.tsx, and AuthenticatedHttpClient tightly enough that they're one atomic, verified-buildable unit at this layer — mirroring why Auth couldn't be split from Catalog either, just one layer down.

Test plan

  • npm install + npm run build --workspace=apps/admin-frontend — green
  • npm run lint --workspace=apps/admin-frontend — clean, 0 warnings
  • npm run format:check --workspace=apps/admin-frontend — clean
  • npm run test --workspace=apps/admin-frontend — 368/368 passing
  • scripts/sync_agent_skills.py --check, scripts/check_agent_governance.py, scripts/architecture_guard.py — all pass

🤖 Generated with Claude Code

…ervices vertical; physical reorg

Split out of #69 (part 3 of 4 — see that PR for the full picture).
Recreated from origin/main after #70 and #71 merged, since this repo's
convention (and the split-large-coderabbit-pr skill) is a sequential
series, not stacking on an unmerged branch — CodeRabbit also doesn't
review PRs whose base isn't the default branch, so stacking silently
skipped review for this and the next PR in the series. Same content as
the original #72, just re-based; no functional change.

This PR is larger than the <100-file target used for the other PRs in
this series, deliberately — see "Why this couldn't be split further"
below.

- Categories, Services, and Tags all move to the Result-based error
  convention docs/adr/014 establishes: domain entities' create() methods,
  mappers, and API repositories return Result<T, AppError> instead of
  throwing; useAsync.ts (already Result-based, landed in #71) is the one
  hook every feature's data layer builds on now.
- app/composition/container.ts's CatalogFacade drops the use-case-class
  indirection (ListCategories/CreateTag/etc. as separate classes) for
  direct repository delegation (`{ execute: repo.method }`) - there's no
  orchestration between the facade and the repository, so the extra
  class per operation wasn't earning its keep. The 24 now-orphaned
  use-case-class files (application/use-cases/{categories,services,tags}/)
  are deleted.
- Services' frontend implementation (ServicesPage, ServiceForm, six
  ServicesPage.*.test.tsx files, all its components/hooks/models) is
  fully removed, reverting `/services` to a placeholder page
  (app/pages/ServicesPage/ServicesPage.tsx) - this vertical is going
  back to `stub` status, see docs/STATUS.md.
- Categories moves to a routed create/edit dialog
  (features/catalog/presentation/categories/pages/CategoriesListPage/,
  .../CategoryEditorDialog/) per docs/adr/012, replacing the old flat
  CategoriesPage.tsx/useCategories.ts/CategoryEditorDialog.tsx shape.
- Tags gets the equivalent internal move (hooks/useTagEditor.ts,
  pages/TagEditorDialog.tsx) and its own Result migration
  (Tag.ts/tagMapper.ts/ApiTagRepository.ts) - Tags itself is not
  being removed here, just migrated; its removal is a later PR in
  this stack (docs/adr/016).
- shared/: AuthenticatedHttpClient's get/post/put/delete now return
  Result<T, AppError> instead of throwing; DeleteConfirmationDialog
  takes entityName/entityType instead of a raw title/description pair;
  useCreateInline is removed (no longer used once Services - its only
  consumer - is gone).
- Also removes .husky/pre-commit and fixes architecture_guard.py's
  precommit check accordingly (already merged independently via #70;
  included here too since this branch's own ancestry needed it before
  #70 existed).

## Why this couldn't be split further

I initially tried a narrower "Category-only foundation" PR (~99 files)
deferring Services/Tags. That failed a real build: app/composition/
container.ts wires TagRepository with its *new* method signature
directly (tagRepository.listAll(options) instead of the old
(tenantContext, options) two-arg form) - not just a return-type
change useAsync-style, but the interface itself. Making that build
without also migrating TagRepository/ApiTagRepository/tagMapper/Tag.ts
for real isn't a smaller wrapper shim - it's the same size of work as
just finishing the migration, since there's no reduced version of an
interface signature. Categories, Services, and Tags share
container.ts's catalog wiring, router.tsx, and AuthenticatedHttpClient
tightly enough that they're one atomic, verified-buildable unit at this
layer - mirroring why Auth couldn't be split from Catalog either,
just one layer down.

## Test plan

- [x] `npm install` + `npm run build --workspace=apps/admin-frontend` — green
- [x] `npm run lint --workspace=apps/admin-frontend` — clean, 0 warnings
- [x] `npm run format:check --workspace=apps/admin-frontend` — clean
- [x] `npm run test --workspace=apps/admin-frontend` — 368/368 passing
- [x] `scripts/sync_agent_skills.py --check`, `scripts/check_agent_governance.py`, `scripts/architecture_guard.py` — all pass

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Aug 2, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 149 files, which is 49 over the limit of 100.

To get a review, narrow the scope:
• coderabbit review --committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 47ebb30a-e3a4-4dca-ac59-d8721933711c

📥 Commits

Reviewing files that changed from the base of the PR and between 110cb7f and 9fa9c0f.

📒 Files selected for processing (149)
  • apps/admin-frontend/.agent.md
  • apps/admin-frontend/AGENTS.md
  • apps/admin-frontend/docs/API.md
  • apps/admin-frontend/docs/DECISIONS.md
  • apps/admin-frontend/docs/STATUS.md
  • apps/admin-frontend/docs/adr/001-clean-architecture-layers.md
  • apps/admin-frontend/docs/adr/012-routed-category-editor.md
  • apps/admin-frontend/docs/adr/013-category-editor-fetches-by-id.md
  • apps/admin-frontend/docs/adr/014-catalog-result-errors-and-global-net.md
  • apps/admin-frontend/docs/adr/015-auth-result-errors.md
  • apps/admin-frontend/e2e/categories-mobile.spec.ts
  • apps/admin-frontend/src/app/composition/container.test.ts
  • apps/admin-frontend/src/app/composition/container.ts
  • apps/admin-frontend/src/app/layouts/AdminLayout.test.tsx
  • apps/admin-frontend/src/app/main.tsx
  • apps/admin-frontend/src/app/pages/ServicesPage/ServicesPage.tsx
  • apps/admin-frontend/src/app/routes/router.tsx
  • apps/admin-frontend/src/features/catalog/application/repositories/CategoryRepository.ts
  • apps/admin-frontend/src/features/catalog/application/repositories/ServiceRepository.ts
  • apps/admin-frontend/src/features/catalog/application/repositories/TagRepository.ts
  • apps/admin-frontend/src/features/catalog/application/test-helpers/createFakeCategoryRepository.ts
  • apps/admin-frontend/src/features/catalog/application/test-helpers/createFakeServiceRepository.ts
  • apps/admin-frontend/src/features/catalog/application/test-helpers/createFakeTagRepository.ts
  • apps/admin-frontend/src/features/catalog/application/use-cases/categories/CreateCategory.test.ts
  • apps/admin-frontend/src/features/catalog/application/use-cases/categories/CreateCategory.ts
  • apps/admin-frontend/src/features/catalog/application/use-cases/categories/DeleteCategory.test.ts
  • apps/admin-frontend/src/features/catalog/application/use-cases/categories/DeleteCategory.ts
  • apps/admin-frontend/src/features/catalog/application/use-cases/categories/ListCategories.test.ts
  • apps/admin-frontend/src/features/catalog/application/use-cases/categories/ListCategories.ts
  • apps/admin-frontend/src/features/catalog/application/use-cases/categories/UpdateCategory.test.ts
  • apps/admin-frontend/src/features/catalog/application/use-cases/categories/UpdateCategory.ts
  • apps/admin-frontend/src/features/catalog/application/use-cases/services/CreateService.test.ts
  • apps/admin-frontend/src/features/catalog/application/use-cases/services/CreateService.ts
  • apps/admin-frontend/src/features/catalog/application/use-cases/services/DeleteService.test.ts
  • apps/admin-frontend/src/features/catalog/application/use-cases/services/DeleteService.ts
  • apps/admin-frontend/src/features/catalog/application/use-cases/services/ListServices.test.ts
  • apps/admin-frontend/src/features/catalog/application/use-cases/services/ListServices.ts
  • apps/admin-frontend/src/features/catalog/application/use-cases/services/UpdateService.test.ts
  • apps/admin-frontend/src/features/catalog/application/use-cases/services/UpdateService.ts
  • apps/admin-frontend/src/features/catalog/application/use-cases/tags/CreateTag.test.ts
  • apps/admin-frontend/src/features/catalog/application/use-cases/tags/CreateTag.ts
  • apps/admin-frontend/src/features/catalog/application/use-cases/tags/DeleteTag.test.ts
  • apps/admin-frontend/src/features/catalog/application/use-cases/tags/DeleteTag.ts
  • apps/admin-frontend/src/features/catalog/application/use-cases/tags/ListTags.test.ts
  • apps/admin-frontend/src/features/catalog/application/use-cases/tags/ListTags.ts
  • apps/admin-frontend/src/features/catalog/application/use-cases/tags/UpdateTag.test.ts
  • apps/admin-frontend/src/features/catalog/application/use-cases/tags/UpdateTag.ts
  • apps/admin-frontend/src/features/catalog/domain/entities/Category.test.ts
  • apps/admin-frontend/src/features/catalog/domain/entities/Category.ts
  • apps/admin-frontend/src/features/catalog/domain/entities/Service.test.ts
  • apps/admin-frontend/src/features/catalog/domain/entities/Service.ts
  • apps/admin-frontend/src/features/catalog/domain/entities/Tag.test.ts
  • apps/admin-frontend/src/features/catalog/domain/entities/Tag.ts
  • apps/admin-frontend/src/features/catalog/domain/errors/InvalidServiceError.ts
  • apps/admin-frontend/src/features/catalog/index.ts
  • apps/admin-frontend/src/features/catalog/infrastructure/mappers/categoryMapper.test.ts
  • apps/admin-frontend/src/features/catalog/infrastructure/mappers/categoryMapper.ts
  • apps/admin-frontend/src/features/catalog/infrastructure/mappers/serviceMapper.test.ts
  • apps/admin-frontend/src/features/catalog/infrastructure/mappers/serviceMapper.ts
  • apps/admin-frontend/src/features/catalog/infrastructure/mappers/tagMapper.test.ts
  • apps/admin-frontend/src/features/catalog/infrastructure/mappers/tagMapper.ts
  • apps/admin-frontend/src/features/catalog/infrastructure/repositories/ApiCategoryRepository.test.ts
  • apps/admin-frontend/src/features/catalog/infrastructure/repositories/ApiCategoryRepository.ts
  • apps/admin-frontend/src/features/catalog/infrastructure/repositories/ApiServiceRepository.test.ts
  • apps/admin-frontend/src/features/catalog/infrastructure/repositories/ApiServiceRepository.ts
  • apps/admin-frontend/src/features/catalog/infrastructure/repositories/ApiTagRepository.test.ts
  • apps/admin-frontend/src/features/catalog/infrastructure/repositories/ApiTagRepository.ts
  • apps/admin-frontend/src/features/catalog/presentation/categories/CategoriesPage.test.tsx
  • apps/admin-frontend/src/features/catalog/presentation/categories/CategoriesPage.tsx
  • apps/admin-frontend/src/features/catalog/presentation/categories/components/CategoryDeleteDialog.tsx
  • apps/admin-frontend/src/features/catalog/presentation/categories/components/CategoryEditorDialog.tsx
  • apps/admin-frontend/src/features/catalog/presentation/categories/hooks/useCategories.test.tsx
  • apps/admin-frontend/src/features/catalog/presentation/categories/hooks/useCategories.ts
  • apps/admin-frontend/src/features/catalog/presentation/categories/hooks/useCategoriesPage.ts
  • apps/admin-frontend/src/features/catalog/presentation/categories/pages/CategoriesListPage/CategoriesListPage.tsx
  • apps/admin-frontend/src/features/catalog/presentation/categories/pages/CategoriesListPage/components/CategoriesTable.tsx
  • apps/admin-frontend/src/features/catalog/presentation/categories/pages/CategoriesListPage/components/CategoriesTable.types.ts
  • apps/admin-frontend/src/features/catalog/presentation/categories/pages/CategoriesListPage/hooks/useCategoriesListPage.ts
  • apps/admin-frontend/src/features/catalog/presentation/categories/pages/CategoriesListPage/hooks/useCategoriesListPage.types.ts
  • apps/admin-frontend/src/features/catalog/presentation/categories/pages/CategoriesListPage/hooks/useCategoryDeletion.ts
  • apps/admin-frontend/src/features/catalog/presentation/categories/pages/CategoriesListPage/hooks/useCategoryDeletion.types.ts
  • apps/admin-frontend/src/features/catalog/presentation/categories/pages/CategoriesRoutes.test.tsx
  • apps/admin-frontend/src/features/catalog/presentation/categories/pages/CategoryEditorDialog/CategoryEditorDialog.tsx
  • apps/admin-frontend/src/features/catalog/presentation/categories/pages/CategoryEditorDialog/forms/CategoryForm.tsx
  • apps/admin-frontend/src/features/catalog/presentation/categories/pages/CategoryEditorDialog/forms/CategoryForm.types.ts
  • apps/admin-frontend/src/features/catalog/presentation/categories/pages/CategoryEditorDialog/forms/categoryFieldMaps.ts
  • apps/admin-frontend/src/features/catalog/presentation/categories/pages/CategoryEditorDialog/hooks/useCategoryEditor.ts
  • apps/admin-frontend/src/features/catalog/presentation/categories/pages/CategoryEditorDialog/hooks/useCategoryEditor.types.ts
  • apps/admin-frontend/src/features/catalog/presentation/services/ServicesPage.accessibilityAndSecurity.test.tsx
  • apps/admin-frontend/src/features/catalog/presentation/services/ServicesPage.crud.test.tsx
  • apps/admin-frontend/src/features/catalog/presentation/services/ServicesPage.dialogLifecycle.test.tsx
  • apps/admin-frontend/src/features/catalog/presentation/services/ServicesPage.formValidation.test.tsx
  • apps/admin-frontend/src/features/catalog/presentation/services/ServicesPage.listBehavior.test.tsx
  • apps/admin-frontend/src/features/catalog/presentation/services/ServicesPage.testSupport.tsx
  • apps/admin-frontend/src/features/catalog/presentation/services/ServicesPage.tsx
  • apps/admin-frontend/src/features/catalog/presentation/services/components/ServiceBasicFields.tsx
  • apps/admin-frontend/src/features/catalog/presentation/services/components/ServiceCategoryField.tsx
  • apps/admin-frontend/src/features/catalog/presentation/services/components/ServiceCommercialFields.tsx
  • apps/admin-frontend/src/features/catalog/presentation/services/components/ServiceDeleteDialog.tsx
  • apps/admin-frontend/src/features/catalog/presentation/services/components/ServiceDialog.tsx
  • apps/admin-frontend/src/features/catalog/presentation/services/components/ServiceDurationFields.tsx
  • apps/admin-frontend/src/features/catalog/presentation/services/components/ServiceTableRow.tsx
  • apps/admin-frontend/src/features/catalog/presentation/services/components/ServiceTagsField.tsx
  • apps/admin-frontend/src/features/catalog/presentation/services/components/ServicesFilters.tsx
  • apps/admin-frontend/src/features/catalog/presentation/services/components/ServicesList.tsx
  • apps/admin-frontend/src/features/catalog/presentation/services/components/ServicesPagination.tsx
  • apps/admin-frontend/src/features/catalog/presentation/services/components/ServicesTable.tsx
  • apps/admin-frontend/src/features/catalog/presentation/services/forms/ServiceForm.schema.test.ts
  • apps/admin-frontend/src/features/catalog/presentation/services/forms/ServiceForm.schema.ts
  • apps/admin-frontend/src/features/catalog/presentation/services/forms/ServiceForm.tsx
  • apps/admin-frontend/src/features/catalog/presentation/services/forms/serviceFieldMaps.ts
  • apps/admin-frontend/src/features/catalog/presentation/services/hooks/useServiceDeletion.test.tsx
  • apps/admin-frontend/src/features/catalog/presentation/services/hooks/useServiceDeletion.ts
  • apps/admin-frontend/src/features/catalog/presentation/services/hooks/useServiceEditor.test.tsx
  • apps/admin-frontend/src/features/catalog/presentation/services/hooks/useServiceEditor.ts
  • apps/admin-frontend/src/features/catalog/presentation/services/hooks/useServiceFilters.test.tsx
  • apps/admin-frontend/src/features/catalog/presentation/services/hooks/useServiceFilters.ts
  • apps/admin-frontend/src/features/catalog/presentation/services/hooks/useServices.test.tsx
  • apps/admin-frontend/src/features/catalog/presentation/services/hooks/useServices.ts
  • apps/admin-frontend/src/features/catalog/presentation/services/hooks/useServicesPage.ts
  • apps/admin-frontend/src/features/catalog/presentation/services/models/serviceFormatters.ts
  • apps/admin-frontend/src/features/catalog/presentation/services/models/servicePresentationModels.ts
  • apps/admin-frontend/src/features/catalog/presentation/tags/TagsPage.test.tsx
  • apps/admin-frontend/src/features/catalog/presentation/tags/TagsPage.tsx
  • apps/admin-frontend/src/features/catalog/presentation/tags/components/TagDeleteDialog.tsx
  • apps/admin-frontend/src/features/catalog/presentation/tags/components/TagEditorDialog.tsx
  • apps/admin-frontend/src/features/catalog/presentation/tags/hooks/useTagEditor.ts
  • apps/admin-frontend/src/features/catalog/presentation/tags/hooks/useTags.test.tsx
  • apps/admin-frontend/src/features/catalog/presentation/tags/hooks/useTags.ts
  • apps/admin-frontend/src/features/catalog/presentation/tags/hooks/useTagsPage.ts
  • apps/admin-frontend/src/features/catalog/presentation/tags/pages/TagEditorDialog.tsx
  • apps/admin-frontend/src/shared/application/HttpClient.ts
  • apps/admin-frontend/src/shared/infrastructure/http/AuthenticatedHttpClient.test.ts
  • apps/admin-frontend/src/shared/infrastructure/http/AuthenticatedHttpClient.ts
  • apps/admin-frontend/src/shared/infrastructure/http/malformedResponseError.ts
  • apps/admin-frontend/src/shared/infrastructure/http/mapErrorToAppError.ts
  • apps/admin-frontend/src/shared/infrastructure/http/parseApiResponse.ts
  • apps/admin-frontend/src/shared/presentation/components/CollectionFeedback.tsx
  • apps/admin-frontend/src/shared/presentation/components/DeleteConfirmationDialog.tsx
  • apps/admin-frontend/src/shared/presentation/components/ErrorBoundary.tsx
  • apps/admin-frontend/src/shared/presentation/hooks/useCreateInline.test.ts
  • apps/admin-frontend/src/shared/presentation/hooks/useCreateInline.ts
  • apps/admin-frontend/src/shared/presentation/hooks/useDeleteConfirmation.ts
  • apps/admin-frontend/src/shared/presentation/hooks/useDialogTarget.ts
  • apps/admin-frontend/src/test/fixtures/createFakeAppContainer.ts
  • apps/admin-frontend/src/test/mocks/handlers/categoryHandlers.ts
  • apps/admin-frontend/src/test/mocks/handlers/index.ts
  • apps/admin-frontend/src/test/mocks/handlers/serviceHandlers.ts
  • scripts/tests/test_architecture_guard.py

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

useCategoryEditor fetches its own category via GET /api/v1/categories/{id}
(docs/adr/013), but this spec's route mock matched any /api/v1/categories*
path and always returned the full list array regardless of whether the
request was for the collection or a single id - so the by-id fetch
received an array instead of a CategoryDto, and the edit dialog's Nome
field never populated. Mock now inspects the last path segment and
returns the matching single category (404 if not found) for a by-id GET,
the full list otherwise.

Verified against the real Playwright suite (production build + preview,
matching CI): all 10 e2e specs pass, including this one.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@evertonschuster

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 2, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@evertonschuster
evertonschuster merged commit 7ad0c92 into main Aug 2, 2026
18 checks passed
@evertonschuster
evertonschuster deleted the pr/03-catalog-category-foundation-v2 branch August 2, 2026 15:15
evertonschuster added a commit that referenced this pull request Aug 2, 2026
Split out of #69 (final part of this series — see that PR for the full
picture). Recreated from origin/main after #70/#71/#75 merged, since
this repo's convention (and the split-large-coderabbit-pr skill) is a
sequential series, not stacking on an unmerged branch. Same content as
the original #73, just re-based; no functional change.

Removes the entire Tags vertical from apps/admin-frontend (domain,
application, infrastructure, presentation, MSW handlers, E2E specs, nav
entry, route, and catalog facade wiring) while intentionally retaining
the backend Tag domain entity and /api/v1/tags endpoints, including
Service's many-to-many relationship to Tag - a project-owner decision,
see docs/adr/016-remove-tags-frontend.md. Categories replaces Tags as
the reference CRUD implementation throughout the docs and the
agenza-frontend-feature skill.

## Test plan

- [x] `npm install` + `npm run build --workspace=apps/admin-frontend` — green
- [x] `npm run lint --workspace=apps/admin-frontend` — clean, 0 warnings
- [x] `npm run format:check --workspace=apps/admin-frontend` — clean
- [x] `npm run test --workspace=apps/admin-frontend` — 305/305 passing
- [x] `npx playwright test` (full e2e suite, production build + preview) — 8/8 passing
- [x] `scripts/sync_agent_skills.py --check`, `scripts/check_agent_governance.py`, `scripts/architecture_guard.py` — all pass

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
evertonschuster added a commit that referenced this pull request Aug 2, 2026
…#77)

These 3 files (agent-skills/agenza-frontend-feature/SKILL.md and its two
synced copies under .claude/skills/ and .agents/skills/) live at the repo
root, outside apps/admin-frontend/ — every diff I computed while splitting
#69 into #70/#71/#75/#76 was scoped to apps/admin-frontend (and backend/
for #70), so these files' accumulated updates from this session (Catalog
Result migration, Auth Result migration, and finally the Tags-removal
doc pass replacing TagsPage/TagForm with Categories as the reference
implementation) never made it into any of the split PRs, even though the
actual code changes they describe are all correctly merged.

Content taken directly from the original branch's final commit
(4911abb), already reviewed and governance-checked at the time. Verified
again here against the current merged main: sync_agent_skills.py --check,
check_agent_governance.py, and architecture_guard.py all pass, and the
file paths the skill references (CategoriesListPage.tsx, CategoryForm.tsx,
categoryMapper.ts, AdminLayout.tsx) all exist in the current tree.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant