phenix-task-reminder-web
ASP.NET MVC 4 front end for Phenix task reminders — viewing, completing and administering reminder tasks — over the Task Reminder WCF service.
Health score
0 to 100 across seven weighted factors; nothing is hidden. Green is 75 and above, amber 50 to 74, red below 50. How scoring works.
Facts
| Languages | csharp, javascript |
| Frameworks | ASP.NET MVC 4 |
| Runtimes | .NET Framework 4.5.2 |
| Tests / CI | some / CI in place |
| Last commit | 2026-02-11 |
| Owner | Owner unknown (mapping to be curated) |
| Domain | Bookings and fulfilment (system generated; curate in repo-owners.json to override) |
| Product area | Phenix |
| Hosted | On-prem Deployed to our own machines
|
| Releases | 2 release pipeline(s): \marketing\phenix-task-reminder-web; \marketing\phenix-task-reminder-web stealth |
| Integration | wcf |
| Source | Open in Azure DevOps |
Risk flags
Each flag links to its glossary definition.
Dependencies in context
Entanglement
kernel Bound into the core by 3 mechanism(s).
- Pinning dependency: application-framework, phenix-feature-service, mail-service
- Speaks WCF (client)
- Shares core database sqlserver:Phenix
- Shares core database sqlserver:EventLog
Detaches when its pinning dependencies are cut or multi-targeted (application-framework, phenix-feature-service, mail-service); and when its WCF surface gains a modern interface or its WCF calls move to one; and when the shared database group it belongs to gains an owned API or completes schema separation (sqlserver:Phenix, sqlserver:EventLog).
Depends on / used by
Migration playbooks
Generated from this repo's assessment data: what is feasible, what blocks it, and the steps in order. Ratings: green means actionable now, amber means sequence other work first, red means blocked, grey means not applicable.
ZDD adoption
A long roadTechnically eligible one day, but the blockers are structural: hosted WCF or SOAP contracts that cannot run two versions at once, or heavy legacy coupling. Sequence the modernisation work first. Legacy web front end: session state and framework age make mixed-version fleets risky until state is externalised.
- Consumes WCF contract packages: never take a breaking client bump mid-feature, and treat obsolete warnings as migration debt
- Shares sqlserver:Phenix with 21 system(s): destructive schema change is prohibited in a single release; expand and contract only
- Shares sqlserver:EventLog with 13 system(s): destructive schema change is prohibited in a single release; expand and contract only
- Feature flags come from phenix-feature-service (WCF-only): flag reads themselves are a legacy dependency to watch
- Adopt the four-stage discipline from the ZDD engineering standard: pre-deployment compatibility, deployment, feature activation behind a flag, post-release cleanup.
- Raise automated test coverage first: ZDD trades the end-of-sprint manual gate for continuous automated confidence, so the tests are the entry ticket.
- Make every change dual-version safe: backwards-compatible APIs (new major version for breaking wire changes), expand and contract for any schema change, and consumers tolerant of unknown fields.
- Audit serialized data: anything in Redis, queues or shared caches must deserialize cleanly across adjacent versions.
- Externalise any remaining session state so users can move between nodes mid-session without disruption.
- Wrap behaviour changes in feature flags so code deploys dark and release becomes a business decision, not a deployment event.
- Route deployments through the Workflow Engine's automated drain, deploy, health-check, return cycle (the path proven by the first automated production run in mid-2026).
- Verify with area-scoped regression rather than the whole-platform cycle, and watch error rates after rollout with automated rollback on alert.
SQL Server exit
Blocked by a shared core databasesqlserver:Phenix, sqlserver:EventLog are shared, so this system cannot change engine on its own: every sharer moves in convoy. The stage 4 work (named owner, declarative schema, owned API) has to land first; after that, the steps below apply to whatever slice this system ends up owning.
- sqlserver:Phenix is shared with 21 other system(s) and is a core database
- sqlserver:EventLog is shared with 13 other system(s) and is a core database
- Inventory the schema and query surface of sqlserver:Phenix, sqlserver:EventLog: tables, stored procedures, triggers, cross-database joins and anything else engine-specific.
- Confirm the target: PostgreSQL (relational model; keep transactions and joins, swap the engine).
- Replatform to modern .NET first (see the recommended actions): current PostgreSQL and MongoDB drivers and EF Core providers target modern .NET, and doing one risky change at a time is cheaper than doing two.
- Data access is not through an ORM, so port the SQL by hand: translate T-SQL constructs, replace stored procedures with application code or target-native equivalents, and add integration tests around the queries that matter first.
- Stand up the target alongside SQL Server, backfill with an ETL pass (pgloader or an export/import job), then dual-write or replicate until parity is proven.
- Move reads to the target, watch correctness and latency, then cut writes over and keep SQL Server read-only until confidence is earned.
- Decommission the SQL Server database and remove the connection strings and firewall paths that pointed at it.
Containerisation
Feasible after replatformingAppropriate, but the .NET Framework runtime has to go first; container work rides along with the replatform rather than preceding it.
- .NET Framework only runs on Windows; practical (Linux) containers need modern .NET
- Replatform to modern .NET first (see the recommended actions). Containerising then becomes routine.
- Add a Dockerfile and make the app read all configuration from environment variables and the secrets manager, never from machine-local files.
- Log to stdout and expose a health check endpoint so ECS can supervise it.
- Adopt the shared ci.yml pipeline template with the container parameters (awsRegion, containerAfterBuild, ecsTerraformRepo), which is exactly how the estate's existing AWS services deploy.
- Define the service in the Terraform repo, deploy to a non-production environment, then shift traffic and disarm the deployment-group release pipeline.
Recommended actions
Rotate the credentials committed to phenix-task-reminder-web
Risk flags indicate credentials or keys in source (plaintext-credentials). Rotate now and enable secret scanning in CI; this is independent of all other work.
Impact: Closes a live security exposure at near-zero cost
proposedReplatform phenix-task-reminder-web to modern .NET
Runs on .NET Framework 4.5.2, out of mainstream support. Blocked until stage 2 cuts: application-framework, phenix-feature-service, mail-service. Shares sqlserver:Phenix, sqlserver:EventLog, so batch it with its database group (stage 4).
Impact: Reduces the end-of-life runtime count
proposedAssessment notes
phenix-task-reminder-web
Purpose
The Phenix task-reminder UI: Home/Task/Admin/LogOn controllers let a travel counsellor see their generated reminder tasks, mark them complete and administer reminder definitions. All reminder logic lives behind the TC.TaskReminder.ServiceClient WCF client from the companion phenix-task-reminder-wcf repo.
Tech stack
Single ASP.NET MVC 4 (Microsoft.AspNet.Mvc 4.0.30506, 2013-era) web project targeting .NET Framework 4.5.2 with old-style csproj and packages.config. Uses the TC.Cache stack with Redis storage (CacheStorage=redis), Phenix forms-auth via TC.Phenix.User, and per-environment Web.config transforms.
Deployment
Release pipelines \marketing\phenix-task-reminder-web and stealth (release_count 2) from a single classic build pipeline — no pipeline YAML in the repo. Deployed under the Phenix IIS site.
Dependencies
Internal packages: TC.TaskReminder.ServiceClient/ServiceContract (phenix-task-reminder-wcf), TC.Phenix.ApplicationFramework/Configuration, TC.Phenix.User, TC.Phenix.Services.Client, TC.Cache.Specialised.PhenixFeature (phenix-feature-service), TC.ContactCentre.ServiceClient, TC.Mail.ServiceClient, TC.UserAccount.ServiceClient, TC.Exceptions. No third-party services.
Data stores
No owned database. Web.config declares connection strings to the shared Phenix and EventLog SQL Server databases; Redis backs the cache.
Integration points
Server-rendered MVC UI; all outbound integration is WCF/SOAP (task reminder, Phenix services, contact centre, mail, user account clients).
Code health
One MSTest project (~29 tests) that appears to duplicate the schedule/date/generation tests from the WCF repo rather than covering the controllers. README is untouched boilerplate. Still receiving commits (2026-02-11). Web.config transforms include plaintext SQL credentials.
Modernisation risks
High: .NET Framework 4.5.2 has been out of support since 2022 and MVC 4 is two generations behind the rest of the Phenix Framework estate, making this one of the oldest live UIs. Entirely WCF-coupled to phenix-task-reminder-wcf, so the pair should be modernised (or replaced) together; classic build pipeline and checked-in credentials add to the debt.