Files
kandev/docs/plans/agent-settings-parity/task-13-notification-settings.md
T
2026-09-10 11:35:46 +01:00

7.9 KiB

id, title, status, wave, depends_on, plan, requirements, acceptance_criteria, system_design
id title status wave depends_on plan requirements acceptance_criteria system_design
13-notification-settings Expose notification provider settings done 13
12-editor-settings
plan.md
REQ-PLATFORM-AGENT-SETTINGS-PARITY-003
REQ-PLATFORM-AGENT-SETTINGS-PARITY-004
REQ-PLATFORM-AGENT-SETTINGS-PARITY-005
REQ-PLATFORM-AGENT-SETTINGS-PARITY-006
REQ-PLATFORM-AGENT-SETTINGS-PARITY-007
REQ-PLATFORM-AGENT-SETTINGS-PARITY-008
REQ-PLATFORM-AGENT-SETTINGS-PARITY-009
AC-PLATFORM-AGENT-SETTINGS-PARITY-006.7
AC-PLATFORM-AGENT-SETTINGS-PARITY-003.1
AC-PLATFORM-AGENT-SETTINGS-PARITY-003.2
AC-PLATFORM-AGENT-SETTINGS-PARITY-003.3
AC-PLATFORM-AGENT-SETTINGS-PARITY-003.5
AC-PLATFORM-AGENT-SETTINGS-PARITY-004.1
AC-PLATFORM-AGENT-SETTINGS-PARITY-004.2
AC-PLATFORM-AGENT-SETTINGS-PARITY-004.3
AC-PLATFORM-AGENT-SETTINGS-PARITY-004.4
AC-PLATFORM-AGENT-SETTINGS-PARITY-004.5
AC-PLATFORM-AGENT-SETTINGS-PARITY-005.1
AC-PLATFORM-AGENT-SETTINGS-PARITY-005.2
AC-PLATFORM-AGENT-SETTINGS-PARITY-005.3
AC-PLATFORM-AGENT-SETTINGS-PARITY-005.5
AC-PLATFORM-AGENT-SETTINGS-PARITY-007.2
AC-PLATFORM-AGENT-SETTINGS-PARITY-007.3
AC-PLATFORM-AGENT-SETTINGS-PARITY-007.5
AC-PLATFORM-AGENT-SETTINGS-PARITY-008.1
AC-PLATFORM-AGENT-SETTINGS-PARITY-008.2
AC-PLATFORM-AGENT-SETTINGS-PARITY-008.3
AC-PLATFORM-AGENT-SETTINGS-PARITY-008.4
AC-PLATFORM-AGENT-SETTINGS-PARITY-008.5
AC-PLATFORM-AGENT-SETTINGS-PARITY-008.6
AC-PLATFORM-AGENT-SETTINGS-PARITY-009.2
AC-PLATFORM-AGENT-SETTINGS-PARITY-009.3
AC-PLATFORM-AGENT-SETTINGS-PARITY-009.4
../../specs/platform/system-design/agent-settings-parity.md
../../specs/platform/system-design/agent-settings-domains.md

Task 13: Expose notification provider settings

Summary

Deliver the domain through the shared settings tools and authorized resource lookup. Include its complete eligible field set, current UI result, and independent contract checks.

In scope

  • Adopt provider names, enabled state, typed provider configuration, and event subscriptions.
  • Preserve per-user ownership and validate the complete patch before persisting provider/event changes.
  • Preserve credential-bearing fields on omission. New reads redact them and never resolve credentials for descriptions.
  • Add an explicit create_notification_provider_kandev adapter if missing. Creation does not send a test notification.
  • Reconcile the provider editor and report unavailable provider capabilities without dropping metadata.
  • Register metadata, context schemas, typed updates, redacted reads, and authorized lookup in the production composition.
  • Add domain aliases to the independent search-query suite and update the generated snapshots.
  • Include shared DTO conversion, semantic validation, and required atomic patch behavior for every write interface.
  • Use current domain events, or add scoped value-free invalidation when none exists.
  • Add coverage bindings and scoped editor tests. Update docs/public/automation-and-mcp.md with delivered behavior.

Out of scope

  • New persistence owners, arbitrary database access, privilege changes, and unrelated lifecycle operations.
  • Automatic merging of dirty drafts, new navigation layouts, and real provider credentials in tests.

Acceptance

  • Registered MCP calls match the existing UI contract for every eligible field, including explicit empties and domain-specific errors.
  • Unauthorized, invalid, and conflicting changes preserve invariants without partial writes or sensitive output. New atomic patches cover competing writers.
  • Clean editors update live and survive reload. Dirty drafts survive until recovery, on desktop and phone.

Verification

Run from the repository root after the one-time workspace dependency install in Task 00. These new test paths and names are planned implementation outputs, not existing evidence.

rtk proxy go -C apps/backend test ./internal/notifications/controller ./internal/notifications/service ./internal/notifications/catalog ./internal/mcp/server ./internal/mcp/handlers
rtk proxy go -C apps/backend run ./cmd/settings-catalog --check
rtk pnpm --dir apps/web exec vitest run lib/settings-discovery/notification-settings-contract.test.ts components/settings/notification-settings-reconciliation.test.tsx
rtk pnpm --dir apps/web run typecheck
rtk pnpm --dir apps/web run i18n:check
rtk pnpm --dir apps/web e2e:run --project chromium tests/settings/notification-settings-mcp.spec.ts
rtk pnpm --dir apps/web e2e:run --project mobile-chrome tests/settings/mobile-notification-settings-mcp.spec.ts
rtk node scripts/validate-public-docs.mjs
rtk git diff --check

Add TestNotificationSettingsParity and TestNotificationSettingsAuthority in apps/backend/internal/mcp/server/settings_notification_settings_test.go. Use real registered tools plus domain fixtures, not only direct handler invocation. Add domain tests for any changed persistence path, including rollback and concurrent updates. When a SQL query changes, include SQLite/PostgreSQL behavior evidence under the existing domain test conventions.

E2E scenario

Change event subscriptions on a disposable provider, verify another user's provider is invisible, and observe reload persistence. Use disposable resources and mock providers. Restore user-level settings in cleanup, including after failures. Run desktop and phone separately with the managed runner and record discovered test counts.

Files likely touched

  • apps/backend/internal/notifications/dto/dto.go
  • apps/backend/internal/notifications/controller/controller.go
  • apps/backend/internal/notifications/service/service.go
  • apps/backend/internal/notifications/catalog/ (new)
  • apps/web/components/settings/notifications-settings-actions.ts
  • apps/web/components/settings/notifications-settings.tsx
  • apps/backend/internal/backendapp/services.go and MCP handler composition.
  • apps/backend/internal/mcp/server/settings_notification_settings_test.go (new).
  • apps/web/lib/settings-discovery/notification-settings-contract.test.ts (new).
  • apps/web/components/settings/notification-settings-reconciliation.test.tsx (new): clean updates, dirty conflicts, own acknowledgements, and late replies.
  • apps/web/lib/settings-discovery/coverage-inventory.ts and generated snapshots.
  • Relevant domain store subscriptions, current editor state, and locale catalogs.
  • The two E2E files named in Verification.

Dependencies

Task 12 completes the preceding slice. Tasks 00 through 04 establish inventory, schemas, generic tools, and draft-recovery behavior. The sequential order avoids conflicts in shared composition and generated snapshots.

Risks

  • Provider configuration can contain secret URLs. Subscription writes must not partially commit an invalid provider patch.
  • Saved settings and active runtime state can differ. Responses must not claim an unobserved runtime change.
  • Missing identity can look like an internal service caller. MCP must reject that case under enforced authentication.

Mobile contract

Reuse the current domain settings route, shared save contributor, and existing phone composition. Keep recovery inline with the existing discard action, one content scroll owner, and safe-area-aware controls. Prove touch access and no horizontal page overflow. No new modal or breakpoint layout is required.

Parallelism

sequential

Inputs

  • Both system designs, especially Required domains, Mutation semantics, Relationships, and Visible results.
  • Task 00's field inventory and each source contract listed above.
  • Existing domain tests, profile parity tests, and nearby shipped settings E2E.
  • Scoped AGENTS.md, /tdd, /mobile-parity, /e2e, and /docs-maintainer before implementation.

Results

Completed on 2026-09-09.

  • Registered notification provider settings with explicit sensitive-field handling.
  • Preserved provider lifecycle and credential-enrollment boundaries.
  • Covered notification descriptors, redaction, and adapter behavior in the focused backend suite.