Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
6b403fa
- UPdate all dev, staging, and local alerts to be warnings only
elipe17 Mar 11, 2026
d1364ee
- add specific url for dev mattermost
elipe17 Mar 12, 2026
fb4fdbe
- Update email logic to handle PIA emails
elipe17 Mar 13, 2026
610dc55
Update tdrs-backend/tdpservice/email/templates/tanf/accepted.html
elipe17 Mar 17, 2026
324d5d1
Update tdrs-backend/tdpservice/email/templates/tanf/accepted_with_err…
elipe17 Mar 17, 2026
b0a0718
Update tdrs-backend/tdpservice/email/templates/tanf/accepted_with_err…
elipe17 Mar 17, 2026
0f2a8ad
Merge branch 'develop' into 5563-pia-email-templates
elipe17 Mar 17, 2026
e643328
Merge branch 'develop' into 5563-pia-email-templates
elipe17 Mar 18, 2026
3994ebf
Merge branch 'develop' into 5578-mm-notifications
elipe17 Mar 18, 2026
5a5269a
Merge branch 'develop' into 5563-pia-email-templates
elipe17 Mar 18, 2026
9c1cddd
- Add missing flags to deployed prometheus instance
elipe17 Mar 18, 2026
f8943b0
add pia feat flag to fixtures
jtimpe Mar 19, 2026
4171b31
add pia file_upload tests
jtimpe Mar 19, 2026
e70f93d
rm focus
jtimpe Mar 19, 2026
ca7d1a4
add .yarn to gitignore
jtimpe Mar 19, 2026
8aebfbf
Update issue templates
elipe17 Mar 19, 2026
8db36bb
- Updated postgres dashboard to always allow querying metrics even if…
elipe17 Mar 19, 2026
9cdfe1c
5434 parsing refactor (#5502)
raftmsohani Mar 20, 2026
263eebf
Merge branch 'develop' into 5563-pia-email-templates
elipe17 Mar 20, 2026
d20f1f4
- explicitely revoke CREATE on non admin roles
elipe17 Mar 20, 2026
a77a98e
Merge pull request #5679 from raft-tech/5563-pia-email-templates
elipe17 Mar 23, 2026
3f17829
Merge branch 'develop' into 5578-mm-notifications
elipe17 Mar 23, 2026
1bec86b
add submission history test
jtimpe Mar 23, 2026
2c44a02
admin pia file upload
jtimpe Mar 23, 2026
3b7095d
fix format
jtimpe Mar 23, 2026
d2b6109
fix fixture user
jtimpe Mar 23, 2026
dd584e3
Merge branch 'develop' into 5420-pia-e2e
jtimpe Mar 23, 2026
5c3b5c3
- Update dashboard to be environment specific
elipe17 Mar 24, 2026
7093053
- remove unused panels
elipe17 Mar 24, 2026
daf0051
Merge pull request #5701 from raft-tech/5420-pia-e2e
jtimpe Mar 25, 2026
f28391a
Merge branch 'develop' into 5523-prometheus-remote-write
elipe17 Mar 25, 2026
0aec4f1
Merge branch 'develop' into 5514-historical-db-metrics
elipe17 Mar 25, 2026
a3b198e
Merge branch 'develop' of https://github.com/raft-tech/TANF-app into …
elipe17 Mar 26, 2026
daf64fc
- Add missing manifest update on deploy.sh
elipe17 Mar 26, 2026
eb87f3f
Merge pull request #5696 from raft-tech/5514-historical-db-metrics
elipe17 Mar 26, 2026
6c68b36
Merge branch 'develop' into 5523-prometheus-remote-write
elipe17 Mar 26, 2026
563ed2c
Merge pull request #5691 from raft-tech/5523-prometheus-remote-write
elipe17 Mar 26, 2026
5d8bf5c
Merge branch 'develop' into 5578-mm-notifications
elipe17 Mar 26, 2026
8a7e601
Merge pull request #5676 from raft-tech/5578-mm-notifications
elipe17 Mar 26, 2026
9a927f9
Merge branch 'develop' into bug-readonly-users-can-create
elipe17 Mar 26, 2026
e223804
Merge pull request #5698 from raft-tech/bug-readonly-users-can-create
elipe17 Mar 26, 2026
32df1f2
implement timezone field on stts model and use in data_file email
mattcoleanderson Mar 26, 2026
dc5fd5b
- Add zero as an allowed value
elipe17 Mar 27, 2026
6980c77
- Updated remove old versions to be significantly more efficient
elipe17 Mar 27, 2026
ce2004c
create tests for timezone in emails
mattcoleanderson Mar 27, 2026
b6c1ada
Merge branch 'develop' into 5585-time-in-emails-represented-as-utc
mattcoleanderson Mar 27, 2026
485d108
Merge branch 'develop' into 3611-env-specific-alert-display
elipe17 Mar 27, 2026
dc4ec72
update migration to use csv to update timezone
mattcoleanderson Mar 30, 2026
f648527
Merge pull request #5749 from raft-tech/5585-time-in-emails-represent…
mattcoleanderson Mar 30, 2026
0bd3fc3
Merge branch 'develop' into 5686-optimize-remove-old-versions
elipe17 Mar 30, 2026
b80b96b
- install specific version of pipenv
elipe17 Mar 30, 2026
905fae9
Merge pull request #5764 from raft-tech/hotfix-pipenv-version
elipe17 Mar 31, 2026
14663b0
Merge branch 'develop' into 5686-optimize-remove-old-versions
elipe17 Mar 31, 2026
8e447fc
Merge branch 'develop' into 5745-zero-allowed
elipe17 Mar 31, 2026
f96b4f6
Merge pull request #5747 from raft-tech/5745-zero-allowed
elipe17 Mar 31, 2026
c851890
Merge branch 'develop' into 3611-env-specific-alert-display
elipe17 Mar 31, 2026
386782f
Merge pull request #5744 from raft-tech/3611-env-specific-alert-display
elipe17 Mar 31, 2026
d92d7cb
Merge branch 'develop' into 5686-optimize-remove-old-versions
elipe17 Mar 31, 2026
5be4509
send feedback report emails to regional users
mattcoleanderson Mar 31, 2026
76ad352
Merge pull request #5748 from raft-tech/5686-optimize-remove-old-vers…
elipe17 Mar 31, 2026
5dd1de5
use a single query to get the data_analyst and regional user emails
mattcoleanderson Mar 31, 2026
58af96f
Merge branch 'develop' into hotfix-add-emails-notifications-for-feedb…
mattcoleanderson Mar 31, 2026
28060d6
Merge pull request #5766 from raft-tech/hotfix-add-emails-notificatio…
mattcoleanderson Apr 1, 2026
e1226fc
5544 add submissionstate enum with default uploaded and migration (#5…
raftmsohani Apr 2, 2026
fba96b6
5545 add submissionlifecycle transition helpers for datafilestate wit…
raftmsohani Apr 2, 2026
feb4b16
Merge pull request #642 from raft-tech/release/v4.16.0
ADPennington Apr 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .circleci/build-and-test/jobs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@
name: Setup cypress test data
command: |
cd tdrs-backend
docker-compose exec web python manage.py loaddata cypress/users cypress/data_files cypress/regions cypress/profile_editing_regions cypress/profile_editing_users
docker-compose exec web python manage.py loaddata cypress/users cypress/data_files cypress/regions cypress/profile_editing_regions cypress/profile_editing_users cypress/feature_flags
- run:
name: Run Cypress e2e tests
command: cd tdrs-frontend; yarn test:e2e-ci
Expand Down
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/bug-template.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name: Bug Report template
about: Template for bug reporting
title: ''
labels: bug, dev
assignees: ''
assignees: kennymcnett, reitermb, victoriaatraft, elipe17

---

Expand Down
9 changes: 9 additions & 0 deletions .github/ISSUE_TEMPLATE/release-tracker-issue-template.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,15 @@ https://github.com/raft-tech/TANF-app/releases/tag/vX.X.X
### 🧪 2. Staging Validation & QASP (ACF / Alex)
*Tracking the status once ACF takes over deployment and testing.*

### Before you Deploy
- [ ] **Requires base image updates**:
- [ ] Re-tag `ghcr.io/raft-tech/tdp-frontend-base:vX.X.X` for the HHS GHCR instance
- [ ] Re-tag `ghcr.io/raft-tech/tdp-backend-base:vX.X.X` for the HHS GHCR instance
- [ ] **Requires HHS CircleCI config updates**:
- [ ]
- [ ] **Requires PLG deployment**

### Staging Deployment
- [ ] **Staging Cleared:** Team notified that Staging is about to be updated/restarted.
- [ ] **Deployed to Staging:** PR merged and deployed to the Staging environment.
- [ ] **Feature Validation:** Testing instructions from the linked PRs have been executed and passed.
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# UI
tdrs-frontend/.yarn/
tdrs-frontend/node_modules/
tdrs-frontend/build/
tdrs-frontend/coverage/
Expand Down Expand Up @@ -125,4 +126,3 @@ cypress.env.json
# DB seeds
tdrs-backend/*.pg
tdrs-backend/django.log

2 changes: 1 addition & 1 deletion Taskfile.yml
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,7 @@ tasks:
cmds:
- export CYPRESS_TOKEN=local-cypress-token
- docker compose -f docker-compose.yml exec web python manage.py delete_cypress_users -usernames new-cypress@teamraft.com cypress-admin@teamraft.com cypress-data-analyst-dana@teamraft.com cypress-fra-data-analyst-derek@teamraft.com cypress-data-analyst-donna@teamraft.com cypress-fra-data-analyst-david@teamraft.com cypress-fra-ofa-regional-staff-rachel@acf.hhs.gov cypress-fra-ofa-regional-staff-robert@acf.hhs.gov cypress-fra-ofa-regional-staff-rita@acf.hhs.gov cypress-fra-ofa-regional-staff-ryan@acf.hhs.gov
- docker compose -f docker-compose.yml exec web python manage.py loaddata cypress/users cypress/data_files cypress/regions cypress/profile_editing_regions cypress/profile_editing_users
- docker compose -f docker-compose.yml exec web python manage.py loaddata cypress/users cypress/data_files cypress/regions cypress/profile_editing_regions cypress/profile_editing_users cypress/feature_flags

frontend-e2e-local:
desc: Run Cypress E2E tests locally (Cypress on host, app in docker)
Expand Down
304 changes: 304 additions & 0 deletions docs/Technical-Documentation/tech-memos/parsing-refactor-plan.md

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# Submission State Machine for File Processing

## Purpose
Define and enforce a clear lifecycle for uploaded files so parsing and triage share a consistent contract. This is a precursor to the parser refactor to avoid churn and make status handling predictable.

## Why a state machine (and what it adds)
- **Guardrails for future changes:** Even though end users cannot alter parsing, developers can. An explicit transition map prevents drift when we add steps (AV scan, retries, change requests) or touch the parser/reparser code paths. Instead of silently landing in an inconsistent state, we fail fast on illegal transitions.
- **Durable, user-visible lifecycle:** `DataFileSummary` is per-parse and can be deleted/recreated during reparses. `DataFile.state` is a durable record of the submission lifecycle (upload -> scan -> parse) that survives reparses and exists even before a summary is created.
- **Better triage and alerts:** Granular states (for example `virus_scan_started` vs `parse_started`) make it obvious where a file stalled without scraping logs. They enable targeted alerts (for example, "stuck in `parse_started` > 15m") and safer retries.

## States
`uploaded` -> `virus_scan_started` -> (`virus_scan_failed` | `virus_scan_successful`) -> `parse_started` -> (`parsed_with_errors` | `parsed_completed`) -> `completed`.

Any active state can transition to `canceled`. A file that exceeds time thresholds in an active state is marked `stuck` (and may later be escalated to `failed` by policy).

Note: parsing can write records in batches. This proposal does not model a separate ingest phase yet.

## Allowed transitions (code sketch)
```python
from dataclasses import dataclass, field
from enum import Enum
from typing import Dict, Iterable


class SubmissionState(str, Enum):
UPLOADED = "uploaded"
VIRUS_SCAN_STARTED = "virus_scan_started"
VIRUS_SCAN_FAILED = "virus_scan_failed"
VIRUS_SCAN_SUCCESSFUL = "virus_scan_successful"
PARSE_STARTED = "parse_started"
PARSE_COMPLETED = "parse_completed"
STUCK = "stuck"
COMPLETED = "completed"
CANCELED = "canceled"


ALLOWED_TRANSITIONS: Dict[SubmissionState, Iterable[SubmissionState]] = {
SubmissionState.UPLOADED: {
SubmissionState.VIRUS_SCAN_STARTED,
SubmissionState.CANCELED,
},
SubmissionState.VIRUS_SCAN_STARTED: {
SubmissionState.VIRUS_SCAN_FAILED,
SubmissionState.VIRUS_SCAN_SUCCESSFUL,
SubmissionState.CANCELED,
},
SubmissionState.VIRUS_SCAN_FAILED: {
SubmissionState.CANCELED,
},
SubmissionState.VIRUS_SCAN_SUCCESSFUL: {
SubmissionState.PARSE_STARTED,
SubmissionState.CANCELED,
},
SubmissionState.PARSE_STARTED: {
SubmissionState.PARSED_WITH_ERRORS,
SubmissionState.PARSED_COMPLETED,
SubmissionState.CANCELED,
},
SubmissionState.PARSED_WITH_ERRORS: {
SubmissionState.COMPLETED,
SubmissionState.CANCELED,
},
SubmissionState.PARSED_COMPLETED: {
SubmissionState.COMPLETED,
SubmissionState.CANCELED,
},
SubmissionState.STUCK: {
SubmissionState.CANCELED,
},
SubmissionState.COMPLETED: set(),
SubmissionState.CANCELED: set(),
}


class InvalidTransition(Exception):
...


@dataclass
class SubmissionLifecycle:
state: SubmissionState
history: list[str] = field(default_factory=list)

def transition(self, next_state: SubmissionState, note: str = "") -> None:
if next_state not in ALLOWED_TRANSITIONS[self.state]:
raise InvalidTransition(f"{self.state} -> {next_state} not allowed")
self.history.append(f"{self.state} -> {next_state}: {note}")
self.state = next_state
2 changes: 1 addition & 1 deletion scripts/apply-database-config.sh
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ echo "Done."
if [[ $app == "tdp-backend-develop" || $space == "tanf-dev" ]]; then
echo "Applying e2e test data"
python manage.py populate_stts
python manage.py loaddata cypress/users cypress/data_files cypress/regions cypress/profile_editing_regions cypress/profile_editing_users
python manage.py loaddata cypress/users cypress/data_files cypress/regions cypress/profile_editing_regions cypress/profile_editing_users cypress/feature_flags
echo "Done."
fi

Expand Down
35 changes: 29 additions & 6 deletions tdrs-backend/plg/alertmanager/alertmanager.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,19 +39,24 @@ route:
- matchers:
- alertname=~"UpTime"
receiver: dev-team-emails
repeat_interval: 24h
repeat_interval: 48h
continue: true
# Send all severity CRITICAL/ERROR alerts to OFA admin emails
- matchers:
- severity=~"ERROR|CRITICAL"
receiver: admin-team-emails
continue: true
# Send all severity CRITICAL/ERROR/WARNING alerts to mattermost and dev team emails
- matchers:
- severity=~"ERROR|CRITICAL|WARNING"
- severity=~"ERROR|CRITICAL"
receiver: mattermost
continue: true
- matchers:
- severity=~"ERROR|CRITICAL|WARNING"
- severity=~"WARNING"
receiver: dev-mattermost
continue: true
- matchers:
- severity=~"ERROR|CRITICAL"
receiver: dev-team-emails
continue: true
# Inhibition rules allow to mute a set of alerts given that another alert is
Expand Down Expand Up @@ -90,11 +95,29 @@ receivers:
{{ if or (eq .Labels.severity "CRITICAL") (eq .Labels.severity "ERROR") }}
@here
{{ end }}
*Alert:* {{ .Annotations.title }}{{ if .Labels.severity }} - `{{ .Labels.severity }}`{{ end }}
*Alert:* {{ .Labels.alertname }}{{ if .Labels.severity }} - `{{ .Labels.severity }}`{{ end }}

*Description:* {{ .Annotations.description }}

*Details:*
• *Job:* `{{ .Labels.job }}`
• *Instance:* `{{ .Labels.instance }}`
• *Env:* `{{ .Labels.env }}`
{{ end }}
- name: 'dev-mattermost'
slack_configs:
- channel: 'tdp-dev-alerts'
username: 'alertmanager'
send_resolved: true
api_url: 'https://fake.mattermost.com'
text: |-
{{ range .Alerts -}}
*Alert:* {{ .Labels.alertname }}{{ if .Labels.severity }} - `{{ .Labels.severity }}`{{ end }}

*Description:* {{ .Annotations.description }}

*Details:*
{{ range .Labels.SortedPairs }} • *{{ .Name }}:* `{{ .Value }}`
{{ end }}
• *Job:* `{{ .Labels.job }}`
• *Instance:* `{{ .Labels.instance }}`
• *Env:* `{{ .Labels.env }}`
{{ end }}
1 change: 1 addition & 0 deletions tdrs-backend/plg/deploy.sh
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ deploy_alertmanager() {
yq eval -i ".global.slack_api_url = \"$MATTERMOST_WEBHOOK_URL\"" $CONFIG
yq eval -i ".receivers[0].email_configs[0].to = \"${ADMIN_EMAILS}\"" $CONFIG
yq eval -i ".receivers[1].email_configs[0].to = \"${DEV_EMAILS}\"" $CONFIG
yq eval -i ".receivers[3].slack_configs[0].api_url = \"${DEV_MATTERMOST_WEBHOOK_URL}\"" $CONFIG
cf push --no-route -f manifest.yml -t 180 --strategy rolling
cf map-route alertmanager apps.internal --hostname alertmanager
rm $CONFIG
Expand Down
Loading