# BLUEPRINT: Dicta-Notes # Version: 2.1.0 # URL: https://dicta-notes.com # Updated: 2026-04-15 ## IDENTITY name: Dicta-Notes description: Meeting transcription and translation PWA for recording conversations, browsing saved sessions, viewing and translating transcripts, analyzing text, analyzing uploaded documents, and exporting transcripts. While online, live recording may sync short audio segments for crash recovery; the Transcribe page shows an Interrupted cloud backup card when recoverable chunks exist, with Recover actions per backup id. Sign-in uses Firebase (email/password or Google). category: communication contact: support@stackapps.com ## AUTH provider: firebase method: email ## ACCESS last-resort: ui ## CAPABILITY: start-recording description: Open the transcribe page, choose microphone or system audio, then start recording. When <> is system-audio, use CLICK [data-agent-id="system-audio-source-btn"] at step 4 instead of the microphone button. input: - name: audio-source type: string required: true description: "microphone or system-audio — which input to use before starting." output: - type: confirmation description: Recording has started; stop control is available and live transcription runs in the UI. auth-required: true scope: form-submit ### UI steps: 1. ASSERT-AUTH 2. NAVIGATE /transcribe 3. WAIT [data-agent-id="microphone-source-btn"] (max: 15s) 4. CLICK [data-agent-id="microphone-source-btn"] 5. CLICK [data-agent-id="start-recording-btn"] 6. WAIT [data-agent-id="stop-recording-btn"] (max: 15s) 7. VERIFY selector_exists [data-agent-id="stop-recording-btn"] ## CAPABILITY: stop-recording description: Stop the active recording on the transcribe page so the session can finish saving. output: - type: confirmation description: Recording stopped; session data is persisted according to app flow. auth-required: true scope: form-submit ### UI steps: 1. ASSERT-AUTH 2. NAVIGATE /transcribe 3. WAIT [data-agent-id="stop-recording-btn"] (max: 15s) 4. CLICK [data-agent-id="stop-recording-btn"] 5. WAIT 3s 6. VERIFY selector_exists [data-agent-id="start-recording-btn"] ## CAPABILITY: recover-interrupted-recording description: On /transcribe, when signed-in users have cloud-synced recording backup chunks (after an interrupted online recording), recover one backup into a new session. The card uses data-agent-id="interrupted-cloud-backup-card"; each row uses recover-backup-session-btn-<>. Optional edit the session title via recording-backup-title-<> before clicking Recover. input: - name: backup-session-id type: string required: true description: "UUID of the interrupted backup (shown in monospace in the card — same value used in recover-backup-session-btn-* and recording-backup-row-*)." output: - type: confirmation description: App navigates to /session-detail?sessionId=... for the new recovered session; backup chunks for that id are removed server-side after success. auth-required: true scope: form-submit ### UI steps: 1. ASSERT-AUTH 2. NAVIGATE /transcribe 3. WAIT [data-agent-id="interrupted-cloud-backup-card"] (max: 20s) 4. OPTIONAL FILL [data-agent-id="recording-backup-title-<>"] "<>" 5. CLICK [data-agent-id="recover-backup-session-btn-<>"] 6. WAIT 20s 7. VERIFY url_contains session-detail?sessionId= ## CAPABILITY: view-sessions description: Open the sessions list and browse saved meeting sessions. From this page, opening a specific row uses CLICK [data-agent-id="view-session-details-<>"] with the same session-id normalization rules as the protocol specification. output: - type: confirmation description: Sessions list is visible with actions to open a session. auth-required: true scope: read-only ### UI steps: 1. ASSERT-AUTH 2. NAVIGATE /sessions 3. WAIT [data-agent-id="new-transcription-btn"] (max: 15s) 4. VERIFY selector_exists [data-agent-id="new-transcription-btn"] ## CAPABILITY: view-transcript description: Open a session and show the Transcript tab content for a given session. input: - name: session-id type: string required: true description: Firestore session identifier. output: - type: confirmation description: Transcript tab is active and transcript UI is available. auth-required: true scope: read-only ### UI steps: 1. ASSERT-AUTH 2. NAVIGATE /session-detail?sessionId=<> 3. WAIT [data-agent-id="transcript-tab"] (max: 15s) 4. CLICK [data-agent-id="transcript-tab"] 5. WAIT [data-agent-id="analyze-transcript-btn"] (max: 15s) 6. VERIFY selector_exists [data-agent-id="analyze-transcript-btn"] ## CAPABILITY: translate-transcript description: On the session Transcript tab, choose a target language and run translate for the full transcript. input: - name: session-id type: string required: true description: Firestore session identifier. - name: target-language type: string required: true description: Target language code for the translation selector (e.g. es, fr, de). output: - type: confirmation description: Translation completes and saved translation is reflected in the transcript view. auth-required: true scope: form-submit ### UI steps: 1. ASSERT-AUTH 2. NAVIGATE /session-detail?sessionId=<> 3. WAIT [data-agent-id="transcript-tab"] (max: 15s) 4. CLICK [data-agent-id="transcript-tab"] 5. WAIT [data-agent-id="translate-language-select"] (max: 15s) 6. SELECT [data-agent-id="translate-language-select"] "<>" 7. CLICK [data-agent-id="translate-transcript-btn"] 8. WAIT 8s 9. VERIFY selector_exists [data-agent-id="translate-transcript-btn"] ## CAPABILITY: analyze-transcript description: On the session Transcript tab, run AI analysis on the meeting transcript text and wait for the inline result. input: - name: session-id type: string required: true description: Firestore session identifier. output: - type: confirmation description: Summary, key points, and action items appear inline on the page after analysis completes. Result is also saved to /documents for later review. auth-required: true scope: form-submit ### UI steps: 1. ASSERT-AUTH 2. NAVIGATE /session-detail?sessionId=<> 3. WAIT [data-agent-id="transcript-tab"] (max: 15s) 4. CLICK [data-agent-id="transcript-tab"] 5. WAIT [data-agent-id="analyze-transcript-btn"] (max: 15s) 6. CLICK [data-agent-id="analyze-transcript-btn"] 7. WAIT 15s 8. VERIFY selector_exists [data-agent-id="analyze-transcript-btn"] ## CAPABILITY: analyze-document description: On the documents page, analyze a PDF/DOCX/TXT file via upload, or use Scan with camera then analyze queued pages. File path uses UPLOAD on the hidden file input. Camera path after navigation CLICK camera-scan-btn, complete the device capture flow, then CLICK analyze-document-pages-btn when it appears. input: - name: document-file type: file required: false description: PDF, DOCX, or TXT file for direct upload; omit when using the camera workflow. output: - type: json description: Analysis summary and structured fields appear on the documents page after processing. auth-required: true scope: form-submit ### UI steps: 1. ASSERT-AUTH 2. NAVIGATE /documents 3. WAIT [data-agent-id="document-upload-input"] (max: 15s) 4. UPLOAD [data-agent-id="document-upload-input"] "<>" 5. WAIT 20s 6. VERIFY selector_exists [data-agent-id="document-upload-input"] ## CAPABILITY: export-transcript description: Export the session transcript from session detail using the Export menu and a chosen format. input: - name: session-id type: string required: true description: Firestore session identifier. - name: export-format type: string required: true description: "One of pdf, docx, txt, md, csv, json — matches export menu options." output: - type: file description: Browser downloads the transcript file in the selected format. auth-required: true scope: form-submit ### UI steps: 1. ASSERT-AUTH 2. NAVIGATE /session-detail?sessionId=<> 3. WAIT [data-agent-id="export-transcript-btn"] (max: 15s) 4. CLICK [data-agent-id="export-transcript-btn"] 5. WAIT [data-agent-id="export-format-<>"] (max: 10s) 6. CLICK [data-agent-id="export-format-<>"] 7. WAIT 5s 8. VERIFY selector_exists [data-agent-id="export-transcript-btn"]