diff --git a/docs/architecture/c4/notifhir/printer/eventsfromprint/index.md b/docs/architecture/c4/notifhir/printer/eventsfromprint/index.md
index 843a104e..d3733dd6 100644
--- a/docs/architecture/c4/notifhir/printer/eventsfromprint/index.md
+++ b/docs/architecture/c4/notifhir/printer/eventsfromprint/index.md
@@ -2,7 +2,7 @@
title: Events from Supplier API
parent: Print Supplier Services
-nav_order: 9
+nav_order: 4
has_children: true
is_not_draft: false
last_modified_date: 2025-12-12
diff --git a/docs/architecture/c4/notifhir/printer/printanalyser/index.md b/docs/architecture/c4/notifhir/printer/printanalyser/index.md
new file mode 100644
index 00000000..9000514d
--- /dev/null
+++ b/docs/architecture/c4/notifhir/printer/printanalyser/index.md
@@ -0,0 +1,15 @@
+---
+
+title: Print Analyser
+parent: Print Supplier Services
+nav_order: 2
+has_children: false
+is_not_draft: false
+last_modified_date: 2025-12-22
+owner: Ross Buggins
+author: Tom D'Roza
+diagrams: [c4code-printer-analyser]
+events-raised: [print-letter-analysed]
+events-consumed: [print-letter-safe]
+c4type: code
+---
diff --git a/docs/architecture/c4/notifhir/printer/printscanner/index.md b/docs/architecture/c4/notifhir/printer/printscanner/index.md
new file mode 100644
index 00000000..733cf3da
--- /dev/null
+++ b/docs/architecture/c4/notifhir/printer/printscanner/index.md
@@ -0,0 +1,15 @@
+---
+
+title: Print Scanner
+parent: Print Supplier Services
+nav_order: 1
+has_children: false
+is_not_draft: false
+last_modified_date: 2025-12-22
+owner: Ross Buggins
+author: Tom D'Roza
+diagrams: [c4code-printer-scanner]
+events-raised: [print-letter-safe]
+events-consumed: [queue-item-dequeued]
+c4type: code
+---
diff --git a/docs/architecture/c4/notifhir/printer/sendtoprint/index.md b/docs/architecture/c4/notifhir/printer/printsender/index.md
similarity index 57%
rename from docs/architecture/c4/notifhir/printer/sendtoprint/index.md
rename to docs/architecture/c4/notifhir/printer/printsender/index.md
index b94b6a84..cd388e40 100644
--- a/docs/architecture/c4/notifhir/printer/sendtoprint/index.md
+++ b/docs/architecture/c4/notifhir/printer/printsender/index.md
@@ -1,15 +1,15 @@
---
-title: Send letter to print
+title: Print Sender
parent: Print Supplier Services
-nav_order: 9
+nav_order: 3
has_children: false
is_not_draft: false
-last_modified_date: 2025-12-04
+last_modified_date: 2025-12-22
owner: Ross Buggins
author: Tom D'Roza
-diagrams: []
+diagrams: [c4code-printer-sender]
events-raised: [external-supplier-api-letter-prepared]
-events-consumed: [queue-item-dequeued]
+events-consumed: [print-letter-analysed]
c4type: code
---
diff --git a/docs/assets/aws-icons-mermaid.json b/docs/assets/aws-icons-mermaid.json
index 0771b0ab..acb06f6b 100644
--- a/docs/assets/aws-icons-mermaid.json
+++ b/docs/assets/aws-icons-mermaid.json
@@ -1086,6 +1086,11 @@
"height": 64,
"width": 64
},
+ "arch-amazon-guardduty": {
+ "body": "",
+ "height": 64,
+ "width": 64
+ },
"artifact": {
"body": "",
"height": 64,
@@ -2486,11 +2491,6 @@
"height": 64,
"width": 64
},
- "guardduty": {
- "body": "",
- "height": 64,
- "width": 64
- },
"health-dashboard": {
"body": "",
"height": 64,
diff --git a/docs/collections/_diagrams/c4code-mesh-acknowledger.md b/docs/collections/_diagrams/c4code-mesh-acknowledger.md
index 3a4ecbec..733eb5d1 100644
--- a/docs/collections/_diagrams/c4code-mesh-acknowledger.md
+++ b/docs/collections/_diagrams/c4code-mesh-acknowledger.md
@@ -8,7 +8,7 @@ title: c4code-mesh-acknowledger
```mermaid
architecture-beta
- group meshAcknowledger(cloud)[MeshAcknowledge]
+ group meshAcknowledger(cloud)[MeshAcknowledger]
service meshDownloaded(aws:res-amazon-eventbridge-event)[MESHInboxMessageDownloaded Event]
service meshAcknowledged(aws:res-amazon-eventbridge-event)[ MESHInboxMessageAcknowledged Event]
service meshAckQueue(logos:aws-sqs)[MeshAcknowledgement Queue] in meshAcknowledger
diff --git a/docs/collections/_diagrams/c4code-mesh-statusreporter-recorder.md b/docs/collections/_diagrams/c4code-mesh-statusreporter-recorder.md
index c118a914..33735014 100644
--- a/docs/collections/_diagrams/c4code-mesh-statusreporter-recorder.md
+++ b/docs/collections/_diagrams/c4code-mesh-statusreporter-recorder.md
@@ -6,7 +6,7 @@ title: c4code-mesh-statusreporter-recorder
```mermaid
architecture-beta
- group statusRecorder(cloud)[StatusRecorder]
+ group statusRecorder(cloud)[ReportStatusRecorder]
service report1Event(aws:res-amazon-eventbridge-event)[DigitalLetterRead Event]
service report2Event(aws:res-amazon-eventbridge-event)[PrintingDispatched Event]
service report3Event(aws:res-amazon-eventbridge-event)[NHSAppMessageRequested Event]
diff --git a/docs/collections/_diagrams/c4code-nhsapp-callback.md b/docs/collections/_diagrams/c4code-nhsapp-callback.md
index 8a74022f..47fadd5a 100644
--- a/docs/collections/_diagrams/c4code-nhsapp-callback.md
+++ b/docs/collections/_diagrams/c4code-nhsapp-callback.md
@@ -6,7 +6,7 @@ title: c4code-nhsapp-callback
```mermaid
architecture-beta
- group CallbackHandler(cloud)[NHSApp Callback Handler]
+ group CallbackHandler(cloud)[NHSAppCallbackHandler]
service nhsapp(server)[NHS App]
service apiGateway(aws:arch-amazon-api-gateway)[API Gateway]
service lambda(logos:aws-lambda)[NHS App Callback Handler] in CallbackHandler
diff --git a/docs/collections/_diagrams/c4code-pdm-poller.md b/docs/collections/_diagrams/c4code-pdm-poller.md
index 4b091fac..447f6b4b 100644
--- a/docs/collections/_diagrams/c4code-pdm-poller.md
+++ b/docs/collections/_diagrams/c4code-pdm-poller.md
@@ -16,12 +16,12 @@ description: PDM Poller
```mermaid
architecture-beta
+ group checkPdm(cloud)[PDMPoller]
service pdmResourceSubmitted(aws:res-amazon-eventbridge-event)[PDMResourceSubmitted Event]
service pdmResourceAvailable(aws:res-amazon-eventbridge-event)[PDMResourceUnavailable Event]
service pdmResourceUnavailable2(aws:res-amazon-eventbridge-event)[PDMResourceAvailable Event]
service pdmRetriesExceeded(aws:res-amazon-eventbridge-event)[PDMResourceRetriesExceeded Event]
service pdmResourceUnavailable(aws:res-amazon-eventbridge-event)[PDMResourceUnavailable Event]
- group checkPdm(cloud)[PDMPoller]
service pollPdmQueue(logos:aws-sqs)[PollPDM SQS Delay Queue] in checkPdm
service pollPdmLambda(logos:aws-lambda)[PollPDM] in checkPdm
service pdm(server)[PDM]
diff --git a/docs/collections/_diagrams/c4code-pdm-upload.md b/docs/collections/_diagrams/c4code-pdm-upload.md
index 88d34453..fe62ded9 100644
--- a/docs/collections/_diagrams/c4code-pdm-upload.md
+++ b/docs/collections/_diagrams/c4code-pdm-upload.md
@@ -7,10 +7,10 @@ description: PDM Upload
```mermaid
architecture-beta
+ group uploadToPdm(cloud)[PDMUploader]
service meshDownloaded(aws:res-amazon-eventbridge-event)[MESHInboxMessageDownloaded Event]
service pdmSaved(aws:res-amazon-eventbridge-event)[PDMResourceSubmitted Event]
service pdmFailed(aws:res-amazon-eventbridge-event)[PDMResourceSubmssionRejected Event]
- group uploadToPdm(cloud)[UploadToPDM]
service uploadQueue(logos:aws-sqs)[UploadToPDM Queue] in uploadToPdm
service uploadLambda(logos:aws-lambda)[UploadToPDM] in uploadToPdm
service s3(logos:aws-s3)[DocumentReference] in uploadToPdm
diff --git a/docs/collections/_diagrams/c4code-printer-analyser.md b/docs/collections/_diagrams/c4code-printer-analyser.md
new file mode 100644
index 00000000..ef468cc0
--- /dev/null
+++ b/docs/collections/_diagrams/c4code-printer-analyser.md
@@ -0,0 +1,22 @@
+---
+
+title: c4code-printer-analyser
+---
+
+
+```mermaid
+architecture-beta
+ service letterSafe(aws:res-amazon-eventbridge-event)[PrintLetterSafe Event]
+ service analyseQueue(logos:aws-sqs)[Analyse Queue] in printAnalyser
+ service analyseLambda(logos:aws-lambda)[PrintAnalyser] in printAnalyser
+ service safeBucket(logos:aws-s3)[SafeLetters] in printAnalyser
+ service letterAnalysed(aws:res-amazon-eventbridge-event)[PrintLetterAnalysed Event]
+ group printAnalyser(cloud)[PrintAnalyser]
+
+ letterSafe:R --> L:analyseQueue
+ analyseQueue:R --> L:analyseLambda
+ safeBucket:B --> T:analyseLambda
+ analyseLambda:R --> L:letterAnalysed
+
+
+```
diff --git a/docs/collections/_diagrams/c4code-printer-removefromqueue.md b/docs/collections/_diagrams/c4code-printer-removefromqueue.md
index a4cc4aa0..1d667e4c 100644
--- a/docs/collections/_diagrams/c4code-printer-removefromqueue.md
+++ b/docs/collections/_diagrams/c4code-printer-removefromqueue.md
@@ -7,7 +7,7 @@ description: Manage TTL
```mermaid
architecture-beta
- group manageTTL(cloud)[ManageTTL]
+ group manageTTL(cloud)[QueueManager]
service pollEvent(aws:res-amazon-eventbridge-event)[TTLPollTimerExpired Event]
service manageLambda(logos:aws-lambda)[Poll TTL] in manageTTL
service manageDb(aws:arch-amazon-dynamodb)[ItemsWithTTL] in manageTTL
diff --git a/docs/collections/_diagrams/c4code-printer-scanner.md b/docs/collections/_diagrams/c4code-printer-scanner.md
new file mode 100644
index 00000000..38ed9126
--- /dev/null
+++ b/docs/collections/_diagrams/c4code-printer-scanner.md
@@ -0,0 +1,42 @@
+---
+
+title: c4code-printer-scanner
+---
+
+
+```mermaid
+architecture-beta
+ group printScanner(cloud)[PrintScanner]
+ service itemDequeued(aws:res-amazon-eventbridge-event)[ItemDequeued Event]
+ service scannerQueue(logos:aws-sqs)[Scanner Queue] in printScanner
+ service scannerLambda(logos:aws-lambda)[PrintScanner] in printScanner
+ service moveLambda(logos:aws-lambda)[MoveLetters] in printScanner
+ service docRefBucket(logos:aws-s3)[DocumentReference] in printScanner
+ service unscannedBucket(logos:aws-s3)[UnscannedLetters] in printScanner
+ service quarantineBucket(logos:aws-s3)[QuarantinedLetters] in printScanner
+ service safeBucket(logos:aws-s3)[SafeLetters] in printScanner
+ service guardDuty(aws:arch-amazon-guardduty)[GuardDuty] in printScanner
+ service scanComplete(aws:res-amazon-eventbridge-event)[ScanResult Event]
+ service safeLetter(aws:res-amazon-eventbridge-event)[PrintLetterSafe Event]
+ service quarantinedLetter(aws:res-amazon-eventbridge-event)[PrintLetterQuarantined Event]
+ junction j1 in printScanner
+ junction j2 in printScanner
+ junction j3 in printScanner
+
+ itemDequeued:R --> L:scannerQueue
+ docRefBucket:B --> T:scannerLambda
+ scannerQueue:R --> L:scannerLambda
+ scannerLambda:B --> T:unscannedBucket
+ unscannedBucket:R --> L:guardDuty
+ guardDuty:R --> L:scanComplete
+ scanComplete:R --> L:moveLambda
+ moveLambda:R -- L:j1
+ j1:T -- B:j2
+ j1:B -- T:j3
+ j2:R --> L:quarantineBucket
+ quarantineBucket:R --> L:quarantinedLetter
+ j3:R --> L:safeBucket
+ safeBucket:R --> L:safeLetter
+
+
+```
diff --git a/docs/collections/_diagrams/c4code-printer-sender.md b/docs/collections/_diagrams/c4code-printer-sender.md
new file mode 100644
index 00000000..ac6ecad6
--- /dev/null
+++ b/docs/collections/_diagrams/c4code-printer-sender.md
@@ -0,0 +1,21 @@
+---
+
+title: c4code-printer-sender
+
+---
+
+
+```mermaid
+architecture-beta
+ service letterAnalysed(aws:res-amazon-eventbridge-event)[PrintLetterAnalysed Event]
+ service printQueue(logos:aws-sqs)[PrintSender Queue] in printSender
+ service printLambda(logos:aws-lambda)[PrintSender] in printSender
+ service letterPrepared(aws:res-amazon-eventbridge-event)[letterPREPARED Event]
+ group printSender(cloud)[PrintSender]
+
+ letterAnalysed:R --> L:printQueue
+ printQueue:R --> L:printLambda
+ printLambda:R --> L:letterPrepared
+
+
+```
diff --git a/docs/collections/_diagrams/c4code-printer-sendtoprint.md b/docs/collections/_diagrams/c4code-printer-sendtoprint.md
deleted file mode 100644
index 9de9839d..00000000
--- a/docs/collections/_diagrams/c4code-printer-sendtoprint.md
+++ /dev/null
@@ -1,27 +0,0 @@
----
-
-title: c4code-printer-sendtoprint
-
----
-
-
-```mermaid
-architecture-beta
- service itemDequeued(aws:res-amazon-eventbridge-event)[ItemDequeued Event]
- service printQueue(logos:aws-sqs)[Print Queue] in sendToPrint
- service printLambda(logos:aws-lambda)[Print] in sendToPrint
- service docRefBucket(logos:aws-s3)[DocumentReference] in sendToPrint
- service digLtrsBucket(logos:aws-s3)[DigitalLetters] in sendToPrint
- service letterPrepared(aws:res-amazon-eventbridge-event)[LetterPrepared Event]
- group sendToPrint(cloud)[SendToPrint]
- junction j1
-
-
- itemDequeued:R --> L:printQueue
- printQueue:R --> L:printLambda
- printLambda:B <-- T:docRefBucket
- printLambda:T --> B:digLtrsBucket
- printLambda:R --> L:letterPrepared
-
-
-```
diff --git a/docs/collections/_diagrams/sequence-print-metadata.md b/docs/collections/_diagrams/sequence-print-metadata.md
new file mode 100644
index 00000000..43213d30
--- /dev/null
+++ b/docs/collections/_diagrams/sequence-print-metadata.md
@@ -0,0 +1,56 @@
+---
+
+title: sequence-expire-print-ttl
+
+---
+
+```mermaid
+sequenceDiagram
+ participant scannerlambda as Lambda
PrintScanner
+ participant analyserLambda as Lambda
PrintAnalyser
+ participant senderLambda as Lambda
PrintSender
+ participant moveLambda as Lambda
MoveLetters
+ participant unscannedS3 as S3
UnscannedLetters
+ participant gd as GuardDuty
+ participant safeS3 as S3
SafeLetters
+ participant quarantinedS3 as S3
QuarantinedLetters
+ participant eventBus as Event Bus
+ participant printApi as Print API
+
+ eventBus ->> scannerlambda: ItemDequeued event
+ activate scannerlambda
+ scannerlambda ->> scannerlambda: Extract & Decode PDF
+ scannerlambda -) unscannedS3: Store PDF
+ deactivate scannerlambda
+ unscannedS3 -) gd: S3 new object event
+ activate gd
+ gd -) gd: Scan for threats
+ gd -) eventBus: ScanResult event
+ deactivate gd
+ eventBus -) moveLambda: ScanResult event
+ activate moveLambda
+ alt Move scanned letter
+ moveLambda ->> safeS3: Store safe PDF
+ moveLambda ->> eventBus: PrintLetterSafe event
+ else
+ moveLambda ->> quarantinedS3: Store quarantined PDF
+ moveLambda ->> eventBus: PrintLetterQuarantined event
+ end
+ moveLambda ->> unscannedS3: Delete unscanned PDF
+ deactivate moveLambda
+ eventBus -) analyserLambda: PrintLetterSafe event
+ activate analyserLambda
+ analyserLambda ->> safeS3: Get scanned PDF
+ activate safeS3
+ safeS3 -->> analyserLambda: PDF
+ deactivate safeS3
+ analyserLambda ->> analyserLambda: Count pages
+ analyserLambda ->> analyserLambda: SHA256
+ analyserLambda ->> eventBus: PrintLetterAnalysed event
+ deactivate analyserLambda
+ eventBus -) senderLambda: PrintLetterAnalysed event
+ activate senderLambda
+ senderLambda -) eventBus: letter.PREPARED event
+ deactivate senderLambda
+ eventBus -) printApi: letter.PREPARED event
+```
diff --git a/src/cloudevents/domains/digital-letters/2025-10-draft/defs/core.schema.yaml b/src/cloudevents/domains/digital-letters/2025-10-draft/defs/core.schema.yaml
index 45d8c45a..7dc5cd94 100644
--- a/src/cloudevents/domains/digital-letters/2025-10-draft/defs/core.schema.yaml
+++ b/src/cloudevents/domains/digital-letters/2025-10-draft/defs/core.schema.yaml
@@ -25,5 +25,4 @@ properties:
"2025-10-01T10:15:30.000Z"
]
type: "string"
- format: "date-time"
pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"