Feature/645 Add PHT Weekly hearing List style guide and PDF - #851
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (3)
🚧 Files skipped from review as they are similar to previous changes (3)
📝 WalkthroughWalkthroughAdds the PHT Weekly Hearing List module with validation, localisation, Excel conversion, web rendering, PDF generation, email summaries, metadata registration, and service integration. ChangesPHT Weekly Hearing List
Sequence Diagram(s)sequenceDiagram
participant WebRequest
participant PHTController
participant PHTRenderer
participant HearingListTemplate
WebRequest->>PHTController: Request weekly hearing list
PHTController->>PHTRenderer: Render hearing data and dates
PHTRenderer-->>PHTController: Return header and hearings
PHTController->>HearingListTemplate: Render localised page
HearingListTemplate-->>WebRequest: Return hearing list HTML
Possibly related issues
Possibly related PRs
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
🎭 Playwright E2E Test Results84 tests 52 ✅ 6m 11s ⏱️ Results for commit f9945f7. ♻️ This comment has been updated with latest results. |
There was a problem hiding this comment.
Actionable comments posted: 6
🧹 Nitpick comments (1)
libs/list-types/pht-weekly-hearing-list/src/pdf/pdf-generator.test.ts (1)
31-53: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winExpand test coverage beyond the happy path.
Only the success path is tested. Consider adding cases for: PDF generation failure (
generatePdfFromHtmlreturnssuccess: false), missingpdfBuffer, Welsh locale (cy), empty hearings list, and unknown provenance fallback. Asserting mock calls (e.g.,savePdfToStoragereceived the correctartefactIdand buffer) would also strengthen the test.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 2b4b0133-f9f4-458e-b02c-e478bd24007f
⛔ Files ignored due to path filters (1)
yarn.lockis excluded by!**/yarn.lock,!**/*.lock
📒 Files selected for processing (31)
apps/web/package.jsonapps/web/src/app.tsapps/web/src/pages/(admin)/non-strategic-upload/index.tsapps/web/src/pages/(list-types)/pht-weekly-hearing-list/index.test.tsapps/web/src/pages/(list-types)/pht-weekly-hearing-list/index.tsapps/web/src/pages/(list-types)/pht-weekly-hearing-list/pht-weekly-hearing-list.njkdocs/tickets/645/plan.mddocs/tickets/645/tasks.mddocs/tickets/645/ticket.mdlibs/list-types/common/src/list-type-data.tslibs/list-types/pht-weekly-hearing-list/package.jsonlibs/list-types/pht-weekly-hearing-list/src/config.tslibs/list-types/pht-weekly-hearing-list/src/conversion/pht-config.tslibs/list-types/pht-weekly-hearing-list/src/email-summary/summary-builder.tslibs/list-types/pht-weekly-hearing-list/src/index.tslibs/list-types/pht-weekly-hearing-list/src/locales/cy.tslibs/list-types/pht-weekly-hearing-list/src/locales/en.tslibs/list-types/pht-weekly-hearing-list/src/models/types.tslibs/list-types/pht-weekly-hearing-list/src/pdf/pdf-generator.test.tslibs/list-types/pht-weekly-hearing-list/src/pdf/pdf-generator.tslibs/list-types/pht-weekly-hearing-list/src/pdf/pdf-template.njklibs/list-types/pht-weekly-hearing-list/src/rendering/renderer.test.tslibs/list-types/pht-weekly-hearing-list/src/rendering/renderer.tslibs/list-types/pht-weekly-hearing-list/src/schemas/pht-weekly-hearing-list.jsonlibs/list-types/pht-weekly-hearing-list/tsconfig.jsonlibs/location/src/location-data.tslibs/notifications/package.jsonlibs/notifications/src/notification/notification-service.tslibs/publication/package.jsonlibs/publication/src/processing/service.tstsconfig.json
| <details class="govuk-details govuk-!-margin-top-6" data-module="govuk-details" open> | ||
| <summary class="govuk-details__summary"> | ||
| <span class="govuk-details__summary-text"> | ||
| {{ t.importantInformationTitle }} | ||
| </span> | ||
| </summary> | ||
| <div class="govuk-details__text"> | ||
| <p class="govuk-body">{{ t.importantInformationText }}</p> | ||
| <p class="govuk-body"> | ||
| <a href="{{ t.importantInformationLinkUrl }}" class="govuk-link"> | ||
| {{ t.importantInformationLinkText }} | ||
| </a> | ||
| </p> | ||
| </div> | ||
| </details> |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '\n== relevant files ==\n'
git ls-files 'apps/web/src/pages/(list-types)/pht-weekly-hearing-list/pht-weekly-hearing-list.njk' \
'apps/web/src/pages/**/pht-weekly-hearing-list*' \
'apps/web/src/**/locales/**' \
'apps/web/src/**/translations/**' \
'apps/web/src/**/i18n/**' \
'apps/web/src/**/content/**' \
'apps/web/src/**/plans/**' \
| sed 's#^`#-` #'
printf '\n== search for importantInformation/contactParagraph/observeLink ==\n'
rg -n "importantInformation|contactParagraph|observeLink" apps/web/src -S
printf '\n== inspect target file ==\n'
cat -n apps/web/src/pages/(list-types)/pht-weekly-hearing-list/pht-weekly-hearing-list.njkRepository: hmcts/cath-service
Length of output: 14219
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '\n== relevant files ==\n'
git ls-files 'apps/web/src/pages/(list-types)/pht-weekly-hearing-list/pht-weekly-hearing-list.njk' \
'apps/web/src/pages/**/pht-weekly-hearing-list*' \
'apps/web/src/**/locales/**' \
'apps/web/src/**/translations/**' \
'apps/web/src/**/i18n/**' \
'apps/web/src/**/content/**' \
'apps/web/src/**/plans/**' \
| sed 's#^`#-` #'
printf '\n== search for importantInformation/contactParagraph/observeLink ==\n'
rg -n "importantInformation|contactParagraph|observeLink" apps/web/src -S
printf '\n== inspect target file ==\n'
cat -n 'apps/web/src/pages/(list-types)/pht-weekly-hearing-list/pht-weekly-hearing-list.njk'Repository: hmcts/cath-service
Length of output: 17985
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '\n== pht page implementation ==\n'
cat -n 'apps/web/src/pages/(list-types)/pht-weekly-hearing-list/index.ts'
printf '\n== pht page tests ==\n'
cat -n 'apps/web/src/pages/(list-types)/pht-weekly-hearing-list/index.test.ts'
printf '\n== any pht locale definitions ==\n'
rg -n "pht-weekly-hearing-list|importantInformationTitle|contactParagraph|observeLinkUrl|observeLinkText" apps/web/src -S --glob '!**/node_modules/**'Repository: hmcts/cath-service
Length of output: 16205
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '\n== pht package references ==\n'
rg -n "`@hmcts/pht-weekly-hearing-list`" . -S
printf '\n== pht key references in tests/config ==\n'
rg -n "importantInformationTitle|importantInformationText|importantInformationLinkUrl|importantInformationLinkText|contactParagraph|observeLinkUrl|observeLinkText" apps/web/src/pages/(list-types)/pht-weekly-hearing-list -S
printf '\n== similar template patterns ==\n'
sed -n '1,40p' 'apps/web/src/pages/(list-types)/ftt-rpt-weekly-hearing-list/ftt-rpt-weekly-hearing-list.njk'
printf '\n---\n'
sed -n '1,40p' 'apps/web/src/pages/(list-types)/wpafcc-weekly-hearing-list/wpafcc-weekly-hearing-list.njk'Repository: hmcts/cath-service
Length of output: 3234
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '\n== pht package references ==\n'
rg -n "`@hmcts/pht-weekly-hearing-list`" . -S
printf '\n== pht key references in page files ==\n'
rg -n "importantInformationTitle|importantInformationText|importantInformationLinkUrl|importantInformationLinkText|contactParagraph|observeLinkUrl|observeLinkText" 'apps/web/src/pages/(list-types)/pht-weekly-hearing-list' -S
printf '\n== similar template patterns ==\n'
sed -n '1,40p' 'apps/web/src/pages/(list-types)/ftt-rpt-weekly-hearing-list/ftt-rpt-weekly-hearing-list.njk'
printf '\n---\n'
sed -n '1,40p' 'apps/web/src/pages/(list-types)/wpafcc-weekly-hearing-list/wpafcc-weekly-hearing-list.njk'Repository: hmcts/cath-service
Length of output: 7128
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '\n== library outline ==\n'
ast-grep outline 'libs/list-types/pht-weekly-hearing-list/src' --view expanded
printf '\n== translation key definitions ==\n'
rg -n "importantInformationTitle|importantInformationText|importantInformationLinkUrl|importantInformationLinkText|contactParagraph|observeLinkUrl|observeLinkText|pageTitle|factLinkUrl|factLinkText" 'libs/list-types/pht-weekly-hearing-list/src' -S
printf '\n== relevant translation files ==\n'
git ls-files 'libs/list-types/pht-weekly-hearing-list/src/**' | sed 's#^`#-` #'Repository: hmcts/cath-service
Length of output: 5942
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '\n== plan excerpt ==\n'
sed -n '68,96p' 'docs/tickets/645/plan.md'
printf '\n== search for pht important information wording ==\n'
rg -n "plain section|collapsible|required per spec|important information" docs/tickets/645 -SRepository: hmcts/cath-service
Length of output: 2146
Use a plain introductory section here.
The PHT spec calls for always-visible introductory text, not a <details> disclosure.
| importantInformationLinkText: "Arsylwi gwrandawiad llys neu dribiwnlys fel newyddiadurwr, ymchwilydd neu aelod o'r cyhoedd", | ||
| importantInformationLinkUrl: "https://www.gov.uk/guidance/observe-a-court-or-tribunal-hearing", | ||
| searchCasesTitle: "Chwilio Achosion", | ||
| searchCasesLabel: "Chwilio yn ôl rhif achos, manylion, lleoliad, barnwr, neu wybodaeth arall", |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Welsh searchCasesLabel doesn't match English equivalent.
The Welsh translation mentions "rhif achos" (case number) and "barnwr" (judge), while the English version references "case name" and "date". These describe different searchable fields. The label should reference the same fields in both languages to ensure consistent user experience.
🌐 Suggested alignment
- searchCasesLabel: "Chwilio yn ôl rhif achos, manylion, lleoliad, barnwr, neu wybodaeth arall",
+ searchCasesLabel: "Chwilio yn ôl enw'r achos, dyddiad, lleoliad, neu fanylion eraill",📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| searchCasesLabel: "Chwilio yn ôl rhif achos, manylion, lleoliad, barnwr, neu wybodaeth arall", | |
| searchCasesLabel: "Chwilio yn ôl enw'r achos, dyddiad, lleoliad, neu fanylion eraill", |
| @@ -0,0 +1,64 @@ | |||
| <!DOCTYPE html> | |||
| <html lang="en"> | |||
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Incomplete Welsh language support in the PDF template. Two user-facing aspects of the template are hardcoded to English, breaking Welsh locale output:
libs/list-types/pht-weekly-hearing-list/src/pdf/pdf-template.njk#L2-L2:<html lang="en">is hardcoded — screen readers will use English pronunciation for Welsh PDFs. Passlocalefrom the generator's render context and uselang="{{ locale }}".libs/list-types/pht-weekly-hearing-list/src/pdf/pdf-template.njk#L51-L51:No hearings scheduled.is hardcoded English — all other user-facing text usest.*translation keys. Add anoHearingsScheduledkey to bothen.tsandcy.tsand reference it as{{ t.noHearingsScheduled }}.
Both fixes require a small change to pdf-generator.ts (passing locale to the render context) and to the locale files.
📍 Affects 1 file
libs/list-types/pht-weekly-hearing-list/src/pdf/pdf-template.njk#L2-L2(this comment)libs/list-types/pht-weekly-hearing-list/src/pdf/pdf-template.njk#L51-L51
| "@hmcts/list-types-common": "workspace:*", | ||
| "@hmcts/london-administrative-court-daily-cause-list": "workspace:*", | ||
| "@hmcts/magistrates-public-list": "workspace:*", | ||
| "@hmcts/pht-weekly-hearing-list": "workspace:*", |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win
Pin the PHT dependency consistently across both manifests.
The same floating workspace:* dependency was added in both package manifests, contrary to the repository requirement for pinned versions.
libs/notifications/package.json#L40-L40: replaceworkspace:*with the exact PHT package version.libs/publication/package.json#L47-L47: replaceworkspace:*with the same exact PHT package version.
📍 Affects 2 files
libs/notifications/package.json#L40-L40(this comment)libs/publication/package.json#L47-L47
Source: Coding guidelines
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
libs/list-types/pht-weekly-hearing-list/src/schemas/pht-weekly-hearing-list.json (1)
22-22: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winAnti-XSS regex rejects legitimate angle-bracket text.
The pattern
^(?!(.|\r|\n)*<[^>]+>)(.|\r|\n)*$rejects any string containing<followed eventually by>, not just HTML tags. Legitimate hearing data such as"See regulation <R> for details"inadditionalInformationor"Case <123>"incaseNamewould fail validation. Consider narrowing the pattern to match only actual HTML tags (tag name starting with a letter):🛡️ Proposed regex refinement
-"pattern": "^(?!(.|\\r|\\n)*<[^>]+>)(.|\\r|\\n)*$" +"pattern": "^(?!(.|\\r|\\n)*<\\s*\\/?\\s*[a-zA-Z][^>]*>)(.|\\r|\\n)*$"This still rejects
<script>,</div>,<img onerror=...>, etc., but allows non-HTML angle-bracket text like<123>or< >.Also applies to: 29-29, 36-36
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 05b10c38-b2bb-455f-ba3d-e4655ec18eca
📒 Files selected for processing (7)
apps/web/src/pages/(list-types)/pht-weekly-hearing-list/index.test.tsapps/web/src/pages/(list-types)/pht-weekly-hearing-list/index.tslibs/list-types/pht-weekly-hearing-list/src/index.tslibs/list-types/pht-weekly-hearing-list/src/rendering/renderer.test.tslibs/list-types/pht-weekly-hearing-list/src/schemas/pht-weekly-hearing-list.jsonlibs/list-types/pht-weekly-hearing-list/src/validation/json-validator.test.tslibs/list-types/pht-weekly-hearing-list/src/validation/json-validator.ts
🚧 Files skipped from review as they are similar to previous changes (4)
- libs/list-types/pht-weekly-hearing-list/src/index.ts
- apps/web/src/pages/(list-types)/pht-weekly-hearing-list/index.ts
- apps/web/src/pages/(list-types)/pht-weekly-hearing-list/index.test.ts
- libs/list-types/pht-weekly-hearing-list/src/rendering/renderer.test.ts
| import { describe, expect, it } from "vitest"; | ||
| import { validatePhtWeeklyHearingList } from "./json-validator.js"; | ||
|
|
||
| const validHearing = { |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Use SCREAMING_SNAKE_CASE for module-level constants.
validHearing is declared with const outside function scope. As per coding guidelines, constants declared outside function scope should use SCREAMING_SNAKE_CASE.
♻️ Proposed rename
-const validHearing = {
+const VALID_HEARING = {
date: "02/01/2025",
caseName: "A Vs B",
hearingLength: "1 hour",
hearingType: "mda",
venue: "Primary Health Tribunal",
additionalInformation: "None"
};All references to validHearing throughout the test file would need to be updated to VALID_HEARING.
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| const validHearing = { | |
| const VALID_HEARING = { |
Source: Coding guidelines
Preview Deployment Successful 🚀Your preview environment is ready:
The environment will be automatically cleaned up when this PR is closed. |
There was a problem hiding this comment.
🧹 Nitpick comments (1)
libs/list-types/pht-weekly-hearing-list/src/email-summary/summary-builder.test.ts (1)
8-10: 🩺 Stability & Availability | 🔵 Trivial | 💤 Low valueRemove the unused
@hmcts/publicationmock.summary-builder.tsonly imports from@hmcts/list-types-common, so this setup adds noise without affecting the test.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 581382e3-2bb4-4fcb-84e8-59c733c25691
📒 Files selected for processing (6)
libs/list-types/pht-weekly-hearing-list/src/email-summary/summary-builder.test.tslibs/list-types/pht-weekly-hearing-list/src/email-summary/summary-builder.tslibs/list-types/pht-weekly-hearing-list/src/pdf/pdf-generator.test.tslibs/list-types/pht-weekly-hearing-list/src/pdf/pdf-generator.tslibs/list-types/pht-weekly-hearing-list/src/rendering/renderer.tslibs/publication/src/processing/service.test.ts
🚧 Files skipped from review as they are similar to previous changes (3)
- libs/list-types/pht-weekly-hearing-list/src/email-summary/summary-builder.ts
- libs/list-types/pht-weekly-hearing-list/src/rendering/renderer.ts
- libs/list-types/pht-weekly-hearing-list/src/pdf/pdf-generator.ts
Preview Deployment Successful 🚀Your preview environment is ready:
The environment will be automatically cleaned up when this PR is closed. |
Preview Deployment Successful 🚀Your preview environment is ready:
The environment will be automatically cleaned up when this PR is closed. |
Resolved conflicts by keeping both PHT_WEEKLY_HEARING_LIST (from feature branch) and magistrates adult court list types (from master) in list-type-data.ts, tsconfig.json paths, and the PDF generator registry. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… types Add pattern/format validation, HTML injection protection, string constraint, and invalid input type tests to magistrates-adult-court-list and magistrates-public-adult-court-list, consistent with the pattern established in PR #844. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…hange state Undoes unnecessary expansion of these test files — they were not in scope. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 2
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 5d28dd9c-d437-47d4-ba46-edaf4d47978b
⛔ Files ignored due to path filters (1)
yarn.lockis excluded by!**/yarn.lock,!**/*.lock
📒 Files selected for processing (13)
apps/web/package.jsonapps/web/src/app.tslibs/list-types/common/src/list-type-data.tslibs/list-types/pht-weekly-hearing-list/src/pdf/pdf-generator.test.tslibs/list-types/pht-weekly-hearing-list/src/pdf/pdf-generator.tslibs/list-types/pht-weekly-hearing-list/src/rendering/renderer.test.tslibs/list-types/pht-weekly-hearing-list/src/rendering/renderer.tslibs/notifications/package.jsonlibs/notifications/src/notification/notification-service.tslibs/publication/package.jsonlibs/publication/src/processing/service.test.tslibs/publication/src/processing/service.tstsconfig.json
🚧 Files skipped from review as they are similar to previous changes (10)
- tsconfig.json
- apps/web/package.json
- libs/notifications/package.json
- libs/publication/package.json
- apps/web/src/app.ts
- libs/publication/src/processing/service.ts
- libs/list-types/common/src/list-type-data.ts
- libs/publication/src/processing/service.test.ts
- libs/notifications/src/notification/notification-service.ts
- libs/list-types/pht-weekly-hearing-list/src/rendering/renderer.test.ts
| const { generateListPdf } = await import("@hmcts/list-types-common"); | ||
| const { provenance: _, ...optionsWithoutProvenance } = BASE_OPTIONS; | ||
|
|
||
| await generatePhtWeeklyHearingListPdf(optionsWithoutProvenance as any); |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Avoid using any without justification.
The use of as any bypasses strict type checking. As per coding guidelines, TypeScript must use strict mode and must not use any without justification. Replace any with a safer cast.
💡 Proposed fix
- await generatePhtWeeklyHearingListPdf(optionsWithoutProvenance as any);
+ await generatePhtWeeklyHearingListPdf(optionsWithoutProvenance as unknown as PdfGenerationOptions);📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| await generatePhtWeeklyHearingListPdf(optionsWithoutProvenance as any); | |
| await generatePhtWeeklyHearingListPdf(optionsWithoutProvenance as unknown as PdfGenerationOptions); |
Source: Coding guidelines
| export const PHT_COURT_NAME = "Primary Health Tribunal"; | ||
| export const PHT_LIST_TITLE = "Primary Health Tribunal Weekly Hearing List"; |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift
Do not hardcode display strings.
The court name and list title are hardcoded in English. As per coding guidelines, court names and other list-type-specific display strings must come from English and Welsh locale files, not hardcoded controller strings.
Please remove these constants and retrieve the translations from the locale files (or pass translation keys to be resolved by the PDF template). Note that downstream calls in pdf-generator.ts and its associated tests will also need to be updated to accommodate this change.
Source: Coding guidelines
formatDisplayDate and formatDdMmYyyyDate use day: "numeric" which produces "2 January 2025" not "02 January 2025". Tests had the wrong expected values. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The CI guard in list-types/common checks for /export\s+.*validate[A-Z]/ in src/index.ts. A wildcard re-export doesn't satisfy that regex. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
Preview Deployment Successful 🚀Your preview environment is ready:
The environment will be automatically cleaned up when this PR is closed. |
Preview Deployment Successful 🚀Your preview environment is ready:
The environment will be automatically cleaned up when this PR is closed. |
|
Preview Deployment Successful 🚀Your preview environment is ready:
The environment will be automatically cleaned up when this PR is closed. |



Jira link
#645
Change description
Add PHT Weekly hearing List style guide and PDF
Testing done
Security Vulnerability Assessment
CVE Suppression: Are there any CVEs present in the codebase (either newly introduced or pre-existing) that are being intentionally suppressed or ignored by this commit?
Checklist
Summary by CodeRabbit