Senior Software Engineer
Description
Senior Full-Stack Software Engineer
Team: Public Safety, Enterprise Report Writing
Location / type: [Troy Office, FT]
Level: Senior
About the role
Report Writing is how officers write incident, arrest, field interview, and case reports in the field. The product spans three codebases that one team owns end to end:
- Client: an Angular 21 web app, also packaged as an Android WebView wrapper, that officers use on unreliable mobile networks. Offline resilience is a product requirement, not a feature.
- Cloud services: AWS serverless back end in GovCloud, built in TypeScript with CDK, Lambda, DynamoDB, OpenSearch, and Cognito. Includes an AI services layer that generates report summaries and extracts people and vehicles from narratives.
- Agent: an on-premise .NET 10 service that translates cloud reports into Tyler's Enterprise Records Management System (RMS) and runs the submission, approval, and print workflows at each agency.
This is a backfill for a senior engineer who shipped in all three tiers, with the heaviest footprint in the client's page-rendering engine and the cloud report-writing service. We need someone who can move between a strict Angular/NgRx front end, a CDK-defined serverless back end, and a .NET integration layer, and who works fluently with Claude Code as part of daily engineering. Our repos carry agent guides, custom skills, subagents, and MCP servers, and most commits in the last year were produced with Claude Code as a pair.
What you will do
- Build and maintain the client's generic page-rendering and dynamic-form layers (NgFormly, NgRx effects, offline queueing) while keeping them agnostic of report type and agency configuration.
- Design Lambda handlers, DynamoDB access patterns, and OpenSearch queries in the cloud report-writing service, and define the infrastructure for them in CDK.
- Extend the AI services layer: async job patterns for summary generation, prompt and payload shaping for token budgets, and IAM for worker invocation.
- Build features in the .NET agent's RMS integration layer: field translation, entity resolvers, duplicate checking, background polling services.
- Write unit, integration, and end-to-end tests with every change across Vitest, Jest, xUnit, and Playwright.
- Triage production issues using logs, traces, and the team's support MCP tooling, and ship hotfixes through the release-branch process across all three repos.
- Use Claude Code daily: follow and improve repo agent guides, write and maintain skills and subagents, wire MCP servers, and review AI-generated code to the same standard as human-written code.
- Maintain shared GitHub Actions workflows, CalVer release tooling, and Terraform Cloud secrets plumbing.
- Review pull requests and mentor mid-level engineers.
Client
- Framework: Angular 21, strict TypeScript 5.9, RxJS 7, Angular CDK, moving to zoneless change detection with signals
- State: NgRx store, effects, entity, router-store
- Forms and UI: NgFormly dynamic forms, Tyler Forge design system, Forge AI components, CKEditor 5, ngx-translate
- Offline and resilience: Service worker / PWA, IndexedDB via idb, custom retry operator, optimistic updates with offline queue
- Testing: Vitest via Analog with jsdom, Playwright end-to-end suites (smoke, extended, case-counter)
- Quality gates: ESLint with custom rules, Prettier, cspell, strict typecheck in CI
- Observability: Datadog RUM and browser logs
Cloud services
- Runtime: Node.js and TypeScript Lambda handlers, esbuild, Middy middleware, Lambda Powertools (logger, tracer, metrics, parameters)
- Infrastructure: AWS CDK with RW-prefixed custom constructs and a configuration loader, cdk-nag, Terraform Cloud for account-level infra and secrets
- Data: DynamoDB, OpenSearch (dashboard search and audit indexes), S3, Secrets Manager, SSM
- Auth: Cognito, custom Lambda authorizer, multi-tenant isolation
- AI: Tyler Foundry client for summaries and entity extraction, async job pattern, Zod schemas
- Region: AWS GovCloud (us-gov-west-1), FIPS constraints
- Testing: Jest unit tests, cached-template CDK tests, scheduled integration suites
- Observability: Datadog CDK constructs, X-Ray, W3C trace context
Agent (ps-reportwriting-agent)
- Runtime: C# 13, .NET 10, ASP.NET Core hosted as a Windows Service on-prem
- Architecture: CQRS with a mediator library, layered solution, Scrutor DI, validated Options
- Integration: HttpClientFactory, Polly, AutoMapper, System.Text.Json
- Auth: OAuth2 / OIDC, JWT bearer, Duende access token management, Cognito
- Testing: xUnit, Moq, AutoFixture, FluentAssertions, coverlet, WebApplicationFactory
- Quality gates: Roslyn analyzers, dotnet format, CodeQL, gitleaks
What we are looking for
Required
- 5+ years building production software with substantial depth in at least two of: Angular (w/ strict TypeScript habits) with NgRx, TypeScript on AWS Lambda with CDK, C# / .NET back-end services. Willingness and demonstrated ability to work in the third.
- Experience building front ends for unreliable networks: retry, optimistic update, offline queueing, and conflict handling.
- Serverless design skills: DynamoDB access patterns, idempotent handlers, async job patterns, IAM least privilege, and infrastructure defined in code.
- Integration experience with systems you do not own over HTTP, including retries, token lifecycle, and defensive handling of partial data.
- Strong testing discipline across unit, integration, and end-to-end layers, and the ability to write asynchronous tests that do not flake.
- Claude Code proficiency. Daily use of Claude Code or an equivalent agentic coding tool for implementation, test repair, and code review. Able to write and maintain repository agent guides, skills, and subagents; configure MCP servers; and critically review AI-generated changes against blocking review rules rather than accept them.
- Production support experience: diagnosing from structured logs and traces, shipping hotfixes through release branches, and communicating risk.
- Clear written communication in PRs, ticket updates, and architecture docs.
Strongly preferred
- Public safety or records management domain (incident, arrest, and case data, NIBRS/IBR, ORI handling).
- NgFormly or another dynamic-forms engine at scale, and Angular signals / zoneless migration experience.
- OpenSearch or Elasticsearch query optimization and index migration.
- Building LLM-backed product features: prompt and payload shaping for token budgets, async generation jobs, evaluation of outputs, and handling of PII.
- Authoring MCP servers or tools that give agents safe read access to production data.
- Terraform Cloud, shared GitHub Actions workflows.
- GovCloud or other FIPS-constrained environments.