Hermes 284313f908
Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Initial import of AlgaPSA codebase from PSA server
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz

Source: /opt/alga-psa on psa.joliet.tech
2026-06-22 16:12:17 -05:00

246 lines
36 KiB
JSON

[
{ "id": "T001", "description": "A01 tickets.create: E2E creates a ticket with minimal required inputs and returns ticket_id/ticket_number outputs", "implemented": false, "featureIds": ["F001","F002","F006"] },
{ "id": "T002", "description": "A01 tickets.create: Validation error when required inputs are missing/invalid (client identity, subject/body)", "implemented": false, "featureIds": ["F002","F009"] },
{ "id": "T003", "description": "A01 tickets.create: Idempotency key prevents duplicate tickets on retry/replay", "implemented": false, "featureIds": ["F005"] },
{ "id": "T004", "description": "A01 tickets.create: Permission denied when caller lacks tickets:create", "implemented": false, "featureIds": ["F007"] },
{ "id": "T005", "description": "A01 tickets.create: Audit entry emitted and linked to workflow run + created ticket", "implemented": false, "featureIds": ["F008"] },
{ "id": "T006", "description": "A01 tickets.create: Attachment reference on create stores attachment and is visible on ticket", "implemented": false, "featureIds": ["F004"] },
{ "id": "T007", "description": "A01 tickets.create: Initial comment behavior respects visibility (public/internal)", "implemented": false, "featureIds": ["F003"] },
{ "id": "T008", "description": "A01 tickets.create: Runtime error codes map correctly (NOT_FOUND/CONFLICT/TRANSIENT_FAILURE)", "implemented": false, "featureIds": ["F009"] },
{ "id": "T009", "description": "A01 tickets.create: Designer form renders from schema and can be saved/published", "implemented": false, "featureIds": ["F010"] },
{ "id": "T010", "description": "A01 tickets.create: Outputs appear in expression autocomplete under vars.<saveAs>", "implemented": false, "featureIds": ["F006","F010"] },
{ "id": "T011", "description": "A01 tickets.create: Concurrency safety under parallel runs does not exhaust DB pool", "implemented": false, "featureIds": ["F001","F002"] },
{ "id": "T012", "description": "A01 tickets.create: Logs redact sensitive fields per policy", "implemented": false, "featureIds": ["F008","F010"] },
{ "id": "T013", "description": "A02 tickets.add_comment: E2E adds internal comment and returns comment_id", "implemented": false, "featureIds": ["F011","F012","F016"] },
{ "id": "T014", "description": "A02 tickets.add_comment: E2E adds public comment and is visible to client portal (if applicable)", "implemented": false, "featureIds": ["F013"] },
{ "id": "T015", "description": "A02 tickets.add_comment: Validation error on missing ticket id or empty body", "implemented": false, "featureIds": ["F012","F019"] },
{ "id": "T016", "description": "A02 tickets.add_comment: Idempotency key prevents duplicate comments", "implemented": false, "featureIds": ["F015"] },
{ "id": "T017", "description": "A02 tickets.add_comment: Permission denied when caller lacks tickets:comment", "implemented": false, "featureIds": ["F017"] },
{ "id": "T018", "description": "A02 tickets.add_comment: Attachment linking works and is visible on ticket", "implemented": false, "featureIds": ["F014"] },
{ "id": "T019", "description": "A02 tickets.add_comment: Audit entry emitted for comment creation", "implemented": false, "featureIds": ["F018"] },
{ "id": "T020", "description": "A02 tickets.add_comment: Error mapping for ticket not found and forbidden visibility", "implemented": false, "featureIds": ["F019"] },
{ "id": "T021", "description": "A02 tickets.add_comment: Designer config renders and saves", "implemented": false, "featureIds": ["F020"] },
{ "id": "T022", "description": "A02 tickets.add_comment: Outputs appear in autocomplete context", "implemented": false, "featureIds": ["F016","F020"] },
{ "id": "T023", "description": "A02 tickets.add_comment: Logs redact sensitive comment bodies per policy", "implemented": false, "featureIds": ["F013","F018"] },
{ "id": "T024", "description": "A02 tickets.add_comment: Parallel runs adding comments do not exhaust DB pool", "implemented": false, "featureIds": ["F011","F012"] },
{ "id": "T025", "description": "A03 tickets.update_fields: E2E updates status/priority/tags and returns updated_at", "implemented": false, "featureIds": ["F021","F023","F026"] },
{ "id": "T026", "description": "A03 tickets.update_fields: Validation error for invalid patch fields or disallowed transitions", "implemented": false, "featureIds": ["F024","F029"] },
{ "id": "T027", "description": "A03 tickets.update_fields: Conflict error on stale concurrency token", "implemented": false, "featureIds": ["F025"] },
{ "id": "T028", "description": "A03 tickets.update_fields: Permission denied when caller lacks tickets:update", "implemented": false, "featureIds": ["F027"] },
{ "id": "T029", "description": "A03 tickets.update_fields: Audit entry emitted with before/after summary", "implemented": false, "featureIds": ["F028"] },
{ "id": "T030", "description": "A03 tickets.update_fields: Error mapping for ticket not found", "implemented": false, "featureIds": ["F029"] },
{ "id": "T031", "description": "A03 tickets.update_fields: Designer patch builder UI renders from schema and saves", "implemented": false, "featureIds": ["F030"] },
{ "id": "T032", "description": "A03 tickets.update_fields: Outputs available in downstream mapping/autocomplete", "implemented": false, "featureIds": ["F026","F030"] },
{ "id": "T033", "description": "A03 tickets.update_fields: No-op updates produce expected output without side effects", "implemented": false, "featureIds": ["F023"] },
{ "id": "T034", "description": "A03 tickets.update_fields: Logs redact any sensitive custom field values", "implemented": false, "featureIds": ["F028"] },
{ "id": "T035", "description": "A03 tickets.update_fields: Parallel updates do not leak connections", "implemented": false, "featureIds": ["F021"] },
{ "id": "T036", "description": "A03 tickets.update_fields: Unsupported fields return VALIDATION_ERROR with field paths", "implemented": false, "featureIds": ["F024"] },
{ "id": "T037", "description": "A04 tickets.assign: E2E assigns ticket to user and returns assignment outputs", "implemented": false, "featureIds": ["F031","F032","F036"] },
{ "id": "T038", "description": "A04 tickets.assign: E2E assigns ticket to queue/team where supported", "implemented": false, "featureIds": ["F033"] },
{ "id": "T039", "description": "A04 tickets.assign: Validation error for unknown assignee", "implemented": false, "featureIds": ["F033","F039"] },
{ "id": "T040", "description": "A04 tickets.assign: No-op assignment when already assigned behaves as configured", "implemented": false, "featureIds": ["F035"] },
{ "id": "T041", "description": "A04 tickets.assign: Permission denied when caller lacks tickets:assign", "implemented": false, "featureIds": ["F037"] },
{ "id": "T042", "description": "A04 tickets.assign: Optional assignment note is created", "implemented": false, "featureIds": ["F034"] },
{ "id": "T043", "description": "A04 tickets.assign: Audit entry emitted for assignment changes", "implemented": false, "featureIds": ["F038"] },
{ "id": "T044", "description": "A04 tickets.assign: Error mapping for ticket not found and forbidden", "implemented": false, "featureIds": ["F039"] },
{ "id": "T045", "description": "A04 tickets.assign: Designer UI renders pickers for user/team/queue", "implemented": false, "featureIds": ["F040"] },
{ "id": "T046", "description": "A04 tickets.assign: Outputs available for downstream steps", "implemented": false, "featureIds": ["F036","F040"] },
{ "id": "T047", "description": "A04 tickets.assign: Parallel assignment does not exhaust connection pool", "implemented": false, "featureIds": ["F031"] },
{ "id": "T048", "description": "A04 tickets.assign: Logs redact internal reason if configured", "implemented": false, "featureIds": ["F038"] },
{ "id": "T049", "description": "A05 tickets.close: E2E closes ticket with resolution and returns closed_at/status", "implemented": false, "featureIds": ["F041","F042","F046"] },
{ "id": "T050", "description": "A05 tickets.close: Validation error for disallowed transition or missing resolution fields", "implemented": false, "featureIds": ["F043","F049"] },
{ "id": "T051", "description": "A05 tickets.close: Optional public closure comment is created", "implemented": false, "featureIds": ["F044"] },
{ "id": "T052", "description": "A05 tickets.close: Notify requester triggers email send (or records failure if email unavailable)", "implemented": false, "featureIds": ["F045"] },
{ "id": "T053", "description": "A05 tickets.close: Permission denied when caller lacks tickets:close", "implemented": false, "featureIds": ["F047"] },
{ "id": "T054", "description": "A05 tickets.close: Audit entry emitted for closure with resolution summary", "implemented": false, "featureIds": ["F048"] },
{ "id": "T055", "description": "A05 tickets.close: Error mapping for ticket not found", "implemented": false, "featureIds": ["F049"] },
{ "id": "T056", "description": "A05 tickets.close: Designer closure form renders with resolution + notify options", "implemented": false, "featureIds": ["F050"] },
{ "id": "T057", "description": "A05 tickets.close: Outputs available to downstream steps", "implemented": false, "featureIds": ["F046","F050"] },
{ "id": "T058", "description": "A05 tickets.close: Closure is idempotent or returns appropriate conflict if already closed", "implemented": false, "featureIds": ["F043"] },
{ "id": "T059", "description": "A05 tickets.close: Logs redact comment bodies by policy", "implemented": false, "featureIds": ["F044","F048"] },
{ "id": "T060", "description": "A05 tickets.close: Parallel closes do not leak connections", "implemented": false, "featureIds": ["F041"] },
{ "id": "T061", "description": "A06 tickets.link_entities: E2E links ticket to project/task/asset and returns link_id", "implemented": false, "featureIds": ["F051","F052","F056"] },
{ "id": "T062", "description": "A06 tickets.link_entities: Validation error for unknown entity type or invalid ids", "implemented": false, "featureIds": ["F052","F059"] },
{ "id": "T063", "description": "A06 tickets.link_entities: Duplicate link returns conflict (or no-op per policy)", "implemented": false, "featureIds": ["F054","F059"] },
{ "id": "T064", "description": "A06 tickets.link_entities: Permission denied when caller lacks tickets:link", "implemented": false, "featureIds": ["F057"] },
{ "id": "T065", "description": "A06 tickets.link_entities: Audit entry emitted for link creation", "implemented": false, "featureIds": ["F058"] },
{ "id": "T066", "description": "A06 tickets.link_entities: Error mapping for ticket/entity not found", "implemented": false, "featureIds": ["F059"] },
{ "id": "T067", "description": "A06 tickets.link_entities: Designer entity picker renders and saves", "implemented": false, "featureIds": ["F060"] },
{ "id": "T068", "description": "A06 tickets.link_entities: Outputs available downstream", "implemented": false, "featureIds": ["F056","F060"] },
{ "id": "T069", "description": "A06 tickets.link_entities: Optional metadata persisted if provided", "implemented": false, "featureIds": ["F055"] },
{ "id": "T070", "description": "A06 tickets.link_entities: Logs redact sensitive entity metadata", "implemented": false, "featureIds": ["F058"] },
{ "id": "T071", "description": "A06 tickets.link_entities: Parallel link creation does not exhaust pool", "implemented": false, "featureIds": ["F051"] },
{ "id": "T072", "description": "A06 tickets.link_entities: Link summary output is stable and typed", "implemented": false, "featureIds": ["F056"] },
{ "id": "T073", "description": "A07 tickets.add_attachment: E2E adds attachment from workflow storage ref and returns attachment_id", "implemented": false, "featureIds": ["F061","F063","F066"] },
{ "id": "T074", "description": "A07 tickets.add_attachment: E2E adds attachment from URL and enforces allowlist/size limits", "implemented": false, "featureIds": ["F064","F065"] },
{ "id": "T075", "description": "A07 tickets.add_attachment: Validation error for unsupported file type or too large file", "implemented": false, "featureIds": ["F065","F069"] },
{ "id": "T076", "description": "A07 tickets.add_attachment: Permission denied when caller lacks tickets:attachments", "implemented": false, "featureIds": ["F067"] },
{ "id": "T077", "description": "A07 tickets.add_attachment: Audit entry emitted for attachment creation", "implemented": false, "featureIds": ["F068"] },
{ "id": "T078", "description": "A07 tickets.add_attachment: Error mapping for fetch/download failures", "implemented": false, "featureIds": ["F069"] },
{ "id": "T079", "description": "A07 tickets.add_attachment: Designer attachment selector renders and saves", "implemented": false, "featureIds": ["F070"] },
{ "id": "T080", "description": "A07 tickets.add_attachment: Outputs available downstream", "implemented": false, "featureIds": ["F066","F070"] },
{ "id": "T081", "description": "A07 tickets.add_attachment: Optional comment is created/linked if provided", "implemented": false, "featureIds": ["F062"] },
{ "id": "T082", "description": "A07 tickets.add_attachment: Logs redact filenames where configured", "implemented": false, "featureIds": ["F065","F068"] },
{ "id": "T083", "description": "A07 tickets.add_attachment: Parallel uploads do not leak connections", "implemented": false, "featureIds": ["F061"] },
{ "id": "T084", "description": "A07 tickets.add_attachment: Attachment output schema stable across sources", "implemented": false, "featureIds": ["F066"] },
{ "id": "T085", "description": "A08 tickets.find: E2E fetches ticket by id and returns summary fields", "implemented": false, "featureIds": ["F071","F072","F074"] },
{ "id": "T086", "description": "A08 tickets.find: E2E fetches ticket by external ref/number when provided", "implemented": false, "featureIds": ["F072","F077"] },
{ "id": "T087", "description": "A08 tickets.find: Include options return comments/attachments/custom fields with limits", "implemented": false, "featureIds": ["F073","F074"] },
{ "id": "T088", "description": "A08 tickets.find: Permission denied when caller lacks tickets:read", "implemented": false, "featureIds": ["F075"] },
{ "id": "T089", "description": "A08 tickets.find: Not-found behavior respects configuration (fail vs null output)", "implemented": false, "featureIds": ["F076"] },
{ "id": "T090", "description": "A08 tickets.find: Telemetry includes include sizes/durations", "implemented": false, "featureIds": ["F078"] },
{ "id": "T091", "description": "A08 tickets.find: Error mapping for invalid identifier formats", "implemented": false, "featureIds": ["F079"] },
{ "id": "T092", "description": "A08 tickets.find: Designer lookup UI renders and saves", "implemented": false, "featureIds": ["F080"] },
{ "id": "T093", "description": "A08 tickets.find: Outputs available in autocomplete/mapping contexts", "implemented": false, "featureIds": ["F074","F080"] },
{ "id": "T094", "description": "A08 tickets.find: Redaction prevents leaking sensitive fields in run logs", "implemented": false, "featureIds": ["F075","F078"] },
{ "id": "T095", "description": "A08 tickets.find: Parallel reads do not exhaust pool", "implemented": false, "featureIds": ["F071"] },
{ "id": "T096", "description": "A08 tickets.find: Deterministic output structure across include permutations", "implemented": false, "featureIds": ["F074"] },
{ "id": "T097", "description": "A09 clients.find: E2E finds client by id and returns client record", "implemented": false, "featureIds": ["F081","F082","F083"] },
{ "id": "T098", "description": "A09 clients.find: E2E finds client by external ref/name where supported", "implemented": false, "featureIds": ["F082","F086"] },
{ "id": "T099", "description": "A09 clients.find: Not-found behavior respects configuration", "implemented": false, "featureIds": ["F084"] },
{ "id": "T100", "description": "A09 clients.find: Permission denied when caller lacks clients:read", "implemented": false, "featureIds": ["F085"] },
{ "id": "T101", "description": "A09 clients.find: Telemetry indicates match strategy", "implemented": false, "featureIds": ["F088"] },
{ "id": "T102", "description": "A09 clients.find: Error mapping for invalid identifiers", "implemented": false, "featureIds": ["F089"] },
{ "id": "T103", "description": "A09 clients.find: Designer lookup UI renders and saves", "implemented": false, "featureIds": ["F090"] },
{ "id": "T104", "description": "A09 clients.find: Outputs appear in autocomplete/mapping contexts", "implemented": false, "featureIds": ["F083","F090"] },
{ "id": "T105", "description": "A09 clients.find: Redaction prevents leaking sensitive client fields in logs", "implemented": false, "featureIds": ["F085"] },
{ "id": "T106", "description": "A09 clients.find: Parallel reads do not exhaust pool", "implemented": false, "featureIds": ["F081"] },
{ "id": "T107", "description": "A09 clients.find: Index-backed lookups meet expected performance in seed data", "implemented": false, "featureIds": ["F087"] },
{ "id": "T108", "description": "A09 clients.find: Output schema remains stable across include options", "implemented": false, "featureIds": ["F083"] },
{ "id": "T109", "description": "A10 clients.search: E2E searches by name fragment and returns paginated results", "implemented": false, "featureIds": ["F091","F092","F094"] },
{ "id": "T110", "description": "A10 clients.search: Filters (status/tags) work and sorting is deterministic", "implemented": false, "featureIds": ["F093","F097"] },
{ "id": "T111", "description": "A10 clients.search: Permission denied when caller lacks clients:read", "implemented": false, "featureIds": ["F095"] },
{ "id": "T112", "description": "A10 clients.search: Result limits enforced and heavy queries rejected", "implemented": false, "featureIds": ["F096"] },
{ "id": "T113", "description": "A10 clients.search: Telemetry emits query/filter/result_count with redaction", "implemented": false, "featureIds": ["F098"] },
{ "id": "T114", "description": "A10 clients.search: Error mapping for invalid filters", "implemented": false, "featureIds": ["F099"] },
{ "id": "T115", "description": "A10 clients.search: Designer search UI renders and saves", "implemented": false, "featureIds": ["F100"] },
{ "id": "T116", "description": "A10 clients.search: Outputs appear in autocomplete/mapping contexts", "implemented": false, "featureIds": ["F094","F100"] },
{ "id": "T117", "description": "A10 clients.search: Deterministic ordering across repeated runs", "implemented": false, "featureIds": ["F097"] },
{ "id": "T118", "description": "A10 clients.search: Parallel searches do not exhaust pool", "implemented": false, "featureIds": ["F091"] },
{ "id": "T119", "description": "A10 clients.search: Query redaction prevents leaking sensitive search terms", "implemented": false, "featureIds": ["F098"] },
{ "id": "T120", "description": "A10 clients.search: Pagination metadata is correct (page size, next token)", "implemented": false, "featureIds": ["F094"] },
{ "id": "T121", "description": "A11 contacts.find: E2E finds contact by email and returns contact record", "implemented": false, "featureIds": ["F101","F102","F104"] },
{ "id": "T122", "description": "A11 contacts.find: Phone normalization lookup works", "implemented": false, "featureIds": ["F103"] },
{ "id": "T123", "description": "A11 contacts.find: Permission denied when caller lacks contacts:read", "implemented": false, "featureIds": ["F105"] },
{ "id": "T124", "description": "A11 contacts.find: Not-found behavior respects configuration", "implemented": false, "featureIds": ["F106"] },
{ "id": "T125", "description": "A11 contacts.find: Deterministic match strategy when multiple contacts match (per config)", "implemented": false, "featureIds": ["F107"] },
{ "id": "T126", "description": "A11 contacts.find: Telemetry indicates match strategy with redaction", "implemented": false, "featureIds": ["F108"] },
{ "id": "T127", "description": "A11 contacts.find: Error mapping for invalid email/phone formats", "implemented": false, "featureIds": ["F109"] },
{ "id": "T128", "description": "A11 contacts.find: Designer lookup UI renders and saves", "implemented": false, "featureIds": ["F110"] },
{ "id": "T129", "description": "A11 contacts.find: Outputs appear in autocomplete/mapping contexts", "implemented": false, "featureIds": ["F104","F110"] },
{ "id": "T130", "description": "A11 contacts.find: PII redaction prevents leaking emails/phones in logs", "implemented": false, "featureIds": ["F105"] },
{ "id": "T131", "description": "A11 contacts.find: Parallel reads do not exhaust pool", "implemented": false, "featureIds": ["F101"] },
{ "id": "T132", "description": "A11 contacts.find: Output schema stable across lookup keys", "implemented": false, "featureIds": ["F104"] },
{ "id": "T133", "description": "A12 contacts.search: E2E searches contacts and returns paginated results", "implemented": false, "featureIds": ["F111","F112","F114"] },
{ "id": "T134", "description": "A12 contacts.search: Filters and deterministic ordering behave correctly", "implemented": false, "featureIds": ["F113","F117"] },
{ "id": "T135", "description": "A12 contacts.search: Permission denied when caller lacks contacts:read", "implemented": false, "featureIds": ["F115"] },
{ "id": "T136", "description": "A12 contacts.search: Result limits enforced and heavy queries rejected", "implemented": false, "featureIds": ["F116"] },
{ "id": "T137", "description": "A12 contacts.search: Telemetry emits query/scope/result_count with redaction", "implemented": false, "featureIds": ["F118"] },
{ "id": "T138", "description": "A12 contacts.search: Error mapping for invalid filters", "implemented": false, "featureIds": ["F119"] },
{ "id": "T139", "description": "A12 contacts.search: Designer search UI renders and saves", "implemented": false, "featureIds": ["F120"] },
{ "id": "T140", "description": "A12 contacts.search: Outputs appear in autocomplete/mapping contexts", "implemented": false, "featureIds": ["F114","F120"] },
{ "id": "T141", "description": "A12 contacts.search: PII redaction prevents leaking search terms and PII in logs", "implemented": false, "featureIds": ["F115","F118"] },
{ "id": "T142", "description": "A12 contacts.search: Parallel searches do not exhaust pool", "implemented": false, "featureIds": ["F111"] },
{ "id": "T143", "description": "A12 contacts.search: Pagination metadata is correct", "implemented": false, "featureIds": ["F114"] },
{ "id": "T144", "description": "A12 contacts.search: Deterministic ordering across repeated runs", "implemented": false, "featureIds": ["F117"] },
{ "id": "T145", "description": "A13 email.send: E2E sends email with minimal inputs and returns message_id/provider/status", "implemented": false, "featureIds": ["F121","F122","F126"] },
{ "id": "T146", "description": "A13 email.send: Subject/body templating can reference workflow variables", "implemented": false, "featureIds": ["F123"] },
{ "id": "T147", "description": "A13 email.send: Attachments from workflow storage are sent and validated", "implemented": false, "featureIds": ["F124"] },
{ "id": "T148", "description": "A13 email.send: Idempotency key prevents duplicate sends", "implemented": false, "featureIds": ["F125"] },
{ "id": "T149", "description": "A13 email.send: Permission denied when caller lacks email:send or invalid from identity", "implemented": false, "featureIds": ["F127"] },
{ "id": "T150", "description": "A13 email.send: Audit event emitted with metadata only (bodies redacted)", "implemented": false, "featureIds": ["F128"] },
{ "id": "T151", "description": "A13 email.send: Error mapping for invalid recipients and provider failures with retry hints", "implemented": false, "featureIds": ["F129"] },
{ "id": "T152", "description": "A13 email.send: Designer email composer renders, previews, and saves", "implemented": false, "featureIds": ["F130"] },
{ "id": "T153", "description": "A13 email.send: Outputs available in downstream steps", "implemented": false, "featureIds": ["F126","F130"] },
{ "id": "T154", "description": "A13 email.send: Rate limiting behavior surfaces RATE_LIMITED errors", "implemented": false, "featureIds": ["F129"] },
{ "id": "T155", "description": "A13 email.send: Parallel sends do not exhaust DB pool", "implemented": false, "featureIds": ["F121"] },
{ "id": "T156", "description": "A13 email.send: Logs redact email bodies by default", "implemented": false, "featureIds": ["F128"] },
{ "id": "T157", "description": "A14 notifications.send_in_app: E2E sends notification to a user and returns notification_ids", "implemented": false, "featureIds": ["F131","F132","F136"] },
{ "id": "T158", "description": "A14 notifications.send_in_app: Sends notifications to role/group recipients", "implemented": false, "featureIds": ["F133"] },
{ "id": "T159", "description": "A14 notifications.send_in_app: Dedupe key prevents repeat notifications within window", "implemented": false, "featureIds": ["F134"] },
{ "id": "T160", "description": "A14 notifications.send_in_app: Deep links navigate to correct UI target", "implemented": false, "featureIds": ["F135"] },
{ "id": "T161", "description": "A14 notifications.send_in_app: Permission denied when caller lacks notifications:send", "implemented": false, "featureIds": ["F137"] },
{ "id": "T162", "description": "A14 notifications.send_in_app: Audit event emitted with recipient redaction", "implemented": false, "featureIds": ["F138"] },
{ "id": "T163", "description": "A14 notifications.send_in_app: Error mapping for invalid recipients", "implemented": false, "featureIds": ["F139"] },
{ "id": "T164", "description": "A14 notifications.send_in_app: Designer recipient picker/composer renders and saves", "implemented": false, "featureIds": ["F140"] },
{ "id": "T165", "description": "A14 notifications.send_in_app: Outputs available in downstream steps", "implemented": false, "featureIds": ["F136","F140"] },
{ "id": "T166", "description": "A14 notifications.send_in_app: Parallel sends do not exhaust pool", "implemented": false, "featureIds": ["F131"] },
{ "id": "T167", "description": "A14 notifications.send_in_app: Severity levels display correctly in UI", "implemented": false, "featureIds": ["F132"] },
{ "id": "T168", "description": "A14 notifications.send_in_app: Logs redact message body if configured", "implemented": false, "featureIds": ["F138"] },
{ "id": "T169", "description": "A15 scheduling.assign_user: E2E creates schedule entry for user and returns schedule_event_id", "implemented": false, "featureIds": ["F141","F142","F146"] },
{ "id": "T170", "description": "A15 scheduling.assign_user: Conflict detection returns CONFLICT on overlap (fail mode)", "implemented": false, "featureIds": ["F143","F149"] },
{ "id": "T171", "description": "A15 scheduling.assign_user: Conflict shift/override modes behave correctly", "implemented": false, "featureIds": ["F143"] },
{ "id": "T172", "description": "A15 scheduling.assign_user: Link to ticket/project persists cross-references", "implemented": false, "featureIds": ["F144"] },
{ "id": "T173", "description": "A15 scheduling.assign_user: Timezone handling is correct for inputs/outputs", "implemented": false, "featureIds": ["F145"] },
{ "id": "T174", "description": "A15 scheduling.assign_user: Permission denied when caller lacks scheduling:write", "implemented": false, "featureIds": ["F147"] },
{ "id": "T175", "description": "A15 scheduling.assign_user: Audit event emitted for schedule creation", "implemented": false, "featureIds": ["F148"] },
{ "id": "T176", "description": "A15 scheduling.assign_user: Error mapping for user not found and forbidden", "implemented": false, "featureIds": ["F149"] },
{ "id": "T177", "description": "A15 scheduling.assign_user: Designer schedule builder renders and saves", "implemented": false, "featureIds": ["F150"] },
{ "id": "T178", "description": "A15 scheduling.assign_user: Outputs available in downstream steps", "implemented": false, "featureIds": ["F146","F150"] },
{ "id": "T179", "description": "A15 scheduling.assign_user: Parallel schedule creation does not leak connections", "implemented": false, "featureIds": ["F141"] },
{ "id": "T180", "description": "A15 scheduling.assign_user: Location metadata persists when provided", "implemented": false, "featureIds": ["F142"] },
{ "id": "T181", "description": "A16 projects.create_task: E2E creates a project task and returns task_id/url/status", "implemented": false, "featureIds": ["F151","F152","F156"] },
{ "id": "T182", "description": "A16 projects.create_task: Link-to-ticket creates bidirectional link", "implemented": false, "featureIds": ["F153"] },
{ "id": "T183", "description": "A16 projects.create_task: Task assignment to user/team works", "implemented": false, "featureIds": ["F155"] },
{ "id": "T184", "description": "A16 projects.create_task: Validation error for missing title or invalid project id", "implemented": false, "featureIds": ["F152","F159"] },
{ "id": "T185", "description": "A16 projects.create_task: Permission denied when caller lacks projects:tasks:create", "implemented": false, "featureIds": ["F157"] },
{ "id": "T186", "description": "A16 projects.create_task: Audit event emitted for task creation", "implemented": false, "featureIds": ["F158"] },
{ "id": "T187", "description": "A16 projects.create_task: Error mapping for project not found/forbidden", "implemented": false, "featureIds": ["F159"] },
{ "id": "T188", "description": "A16 projects.create_task: Designer task create form renders and saves", "implemented": false, "featureIds": ["F160"] },
{ "id": "T189", "description": "A16 projects.create_task: Outputs available downstream", "implemented": false, "featureIds": ["F156","F160"] },
{ "id": "T190", "description": "A16 projects.create_task: Parallel task creation does not exhaust pool", "implemented": false, "featureIds": ["F151"] },
{ "id": "T191", "description": "A16 projects.create_task: Initial status/priority set correctly", "implemented": false, "featureIds": ["F154"] },
{ "id": "T192", "description": "A16 projects.create_task: Link entity uniqueness maintained", "implemented": false, "featureIds": ["F153"] },
{ "id": "T193", "description": "A17 time.create_entry: E2E creates time entry linked to ticket and returns time_entry_id/totals", "implemented": false, "featureIds": ["F161","F162","F166"] },
{ "id": "T194", "description": "A17 time.create_entry: Link to project/task works and validates targets", "implemented": false, "featureIds": ["F163","F169"] },
{ "id": "T195", "description": "A17 time.create_entry: Duration validation and rounding policy enforced", "implemented": false, "featureIds": ["F165"] },
{ "id": "T196", "description": "A17 time.create_entry: Permission denied when caller lacks time:write or cannot log for other users", "implemented": false, "featureIds": ["F167"] },
{ "id": "T197", "description": "A17 time.create_entry: Audit event emitted for time entry creation", "implemented": false, "featureIds": ["F168"] },
{ "id": "T198", "description": "A17 time.create_entry: Error mapping for invalid duration/target not found", "implemented": false, "featureIds": ["F169"] },
{ "id": "T199", "description": "A17 time.create_entry: Designer time entry form renders and saves", "implemented": false, "featureIds": ["F170"] },
{ "id": "T200", "description": "A17 time.create_entry: Outputs available downstream", "implemented": false, "featureIds": ["F166","F170"] },
{ "id": "T201", "description": "A17 time.create_entry: Billable/non-billable flags persist correctly", "implemented": false, "featureIds": ["F164"] },
{ "id": "T202", "description": "A17 time.create_entry: Parallel time entries do not exhaust pool", "implemented": false, "featureIds": ["F161"] },
{ "id": "T203", "description": "A17 time.create_entry: Notes stored and redacted in logs where configured", "implemented": false, "featureIds": ["F168"] },
{ "id": "T204", "description": "A17 time.create_entry: Output totals match expected duration after rounding", "implemented": false, "featureIds": ["F166","F165"] },
{ "id": "T205", "description": "A18 crm.create_activity_note: E2E creates note on client and returns note_id", "implemented": false, "featureIds": ["F171","F172","F176"] },
{ "id": "T206", "description": "A18 crm.create_activity_note: Supports targets (contact/ticket/project) and validates existence", "implemented": false, "featureIds": ["F173"] },
{ "id": "T207", "description": "A18 crm.create_activity_note: Visibility rules enforced (internal vs client-visible)", "implemented": false, "featureIds": ["F174"] },
{ "id": "T208", "description": "A18 crm.create_activity_note: Permission denied when caller lacks crm:notes:create", "implemented": false, "featureIds": ["F177"] },
{ "id": "T209", "description": "A18 crm.create_activity_note: Audit event emitted for note creation", "implemented": false, "featureIds": ["F178"] },
{ "id": "T210", "description": "A18 crm.create_activity_note: Error mapping for target not found/forbidden", "implemented": false, "featureIds": ["F179"] },
{ "id": "T211", "description": "A18 crm.create_activity_note: Designer note composer renders and saves", "implemented": false, "featureIds": ["F180"] },
{ "id": "T212", "description": "A18 crm.create_activity_note: Outputs available downstream", "implemented": false, "featureIds": ["F176","F180"] },
{ "id": "T213", "description": "A18 crm.create_activity_note: Category/tags persist and can be queried later", "implemented": false, "featureIds": ["F175"] },
{ "id": "T214", "description": "A18 crm.create_activity_note: Redaction prevents leaking note body in logs", "implemented": false, "featureIds": ["F174","F178"] },
{ "id": "T215", "description": "A18 crm.create_activity_note: Parallel note creation does not exhaust pool", "implemented": false, "featureIds": ["F171"] },
{ "id": "T216", "description": "A18 crm.create_activity_note: Output schema stable across target types", "implemented": false, "featureIds": ["F176"] },
{ "id": "T217", "description": "Cross-cutting: Action registry lists all 18 actions with correct metadata and versions", "implemented": false, "featureIds": ["F001","F011","F021","F031","F041","F051","F061","F071","F081","F091","F101","F111","F121","F131","F141","F151","F161","F171"] },
{ "id": "T218", "description": "Cross-cutting: All action input/output schemas validate and render in the designer without runtime errors", "implemented": false, "featureIds": ["F010","F020","F030","F040","F050","F060","F070","F080","F090","F100","F110","F120","F130","F140","F150","F160","F170","F180"] },
{ "id": "T219", "description": "Cross-cutting: Standard error codes are consistent across all actions", "implemented": false, "featureIds": ["F009","F019","F029","F039","F049","F059","F069","F079","F089","F099","F109","F119","F129","F139","F149","F159","F169","F179"] },
{ "id": "T220", "description": "Cross-cutting: Audit events include tenant, run id, action id/version, and target resource IDs for every mutating action", "implemented": false, "featureIds": ["F008","F018","F028","F038","F048","F058","F068","F128","F138","F148","F158","F168","F178"] },
{ "id": "T221", "description": "Cross-cutting: Secrets referenced by actions are never logged and are redacted in run views", "implemented": false, "featureIds": ["F127","F128","F065","F124"] },
{ "id": "T222", "description": "Cross-cutting: Under load (parallel workflow runs), system remains within DB pool limits (no KnexTimeoutError)", "implemented": false, "featureIds": ["F001","F011","F021","F031","F041","F051","F061","F071","F081","F091","F101","F111","F121","F131","F141","F151","F161","F171"] },
{ "id": "T223", "description": "Cross-cutting: Action outputs are typed and visible in mapping UI and expression autocomplete", "implemented": false, "featureIds": ["F006","F016","F026","F036","F046","F056","F066","F074","F083","F094","F104","F114","F126","F136","F146","F156","F166","F176"] },
{ "id": "T224", "description": "Cross-cutting: Documentation/examples appear in the designer help for each action", "implemented": false, "featureIds": ["F010","F020","F030","F040","F050","F060","F070","F080","F090","F100","F110","F120","F130","F140","F150","F160","F170","F180"] }
]