docs/specs/20260625-171840-agent-feature.mdadded---
spec: agent-feature
status: ready
owner: feature-pipeline-agent
related-routes:
files:
# (none listed)
---
# agent-feature
## Goal
Enforce uniqueness of "Name" per entity scope on five existing project-scoped
xyz tables: AssetType, SystemType, Asset, CommissioningSystem (the "System"
in the spec), and CommissioningWorkflow (the "Workflow" in the spec).
Uniqueness is scoped per project (ProjectShardId) and, where the entity has a
natural parent scope, per that parent. Duplicates must be cleaned up before the
unique constraint is applied. No new tables are introduced.
## Behavior changes
- {db_calls: [usp_InsertAssetType, usp_InsertSystemType, usp_InsertAsset, usp_UpdateAsset,
usp_InsertCommissioningSystem, usp_UpdateCommissioningSystem, usp_InsertCommissioningWorkflow,
usp_UpdateCommissioningWorkflow], kind: error_mapping, notes: "For each of the\
\ five entity write paths (create + update where applicable),\ncatch the DB unique-violation\
\ (DB_ConstraintViolationError / SQLSTATE 23505\nor the explicit RAISE from the\
\ amended procs) and map it to a 409 Conflict\nusing a typed error from src/types/errortypes.ts\
\ (e.g. a Conflict/duplicate\nerror), with a clear message naming the entity and\
\ the colliding name.\nDo NOT add inline SQL \u2014 continue to call the existing\
\ usp_* procedures via\nthe existing const query strings. The actual service filenames\
\ must be\nconfirmed against the repo; the names above are the conventional lowercase\n\
dot-separated forms.\n", services: [asset.types.service.ts, system.types.service.ts,
assets.service.ts, commissioning.systems.service.ts, commissioning.workflows.service.ts]}
- {kind: tests_and_dtos, notes: "No DTO shape changes are required (Name field already\
\ exists). However,\nbecause the write procs are amended, existing API2 unit/e2e\
\ tests, mocks,\nand fixtures for these five entities must be updated so that:\n\
\ - duplicate-name create/update returns 409,\n - non-duplicate create/update\
\ still returns the existing success codes.\nUpdate fixtures/mocks so `npm test`\
\ stays green.\n"}
## Acceptance criteria
- [ ] The behavior described above is implemented on the listed files.
- [ ] Existing behavior is unchanged when the new feature is not exercised.
- [ ] Unit and (where observable) e2e tests cover the new behavior.
## Out of scope
- No changes to read endpoints or read procedures/functions.
- No new columns added to any table; only constraint/index + proc error handling.
- No case-insensitive normalization unless the open question is resolved that way at Gate 2.
- No new entities or tables.
## Notes / open questions
- Generated by the feature pipeline from the approved architect plan. If any
acceptance criterion is ambiguous, ask the human before implementing.