How to validate this branch (teams-ax-fix-chat-scrape) against a real Teams meeting.
- Pull the branch:
git fetch origin git checkout teams-ax-fix-chat-scrape
- Build and install:
This builds, installs to
./scripts/bundle.sh --install
/Applications/Heard.app, and relaunches — needed so TCC permissions (Accessibility, etc.) stay anchored to a stable path. - Turn on Developer Mode: Settings → General → "Show Advanced Settings" → Advanced tab
→ Developer Mode. This is what makes
dict-debug.logwrite at all. - Optional — enable the new chat toggle if you want to test that too: Settings → Recording → "Meeting Chat" → "Include Meeting Chat in Transcript". Leave it off if you just want to verify the AX-wake fix first (it defaults off).
- Join a real Teams meeting.
- Tail the log:
tail -f ~/Library/Application\ Support/Heard/dict-debug.log
- If the chat toggle is on, open Teams' chat panel at some point during the call and send/receive at least one message.
- End the meeting and check the generated
.mdtranscript in your configured output folder.
enableMeetingAppAccessibility: ... setErr=<n> fallbackSetErr=<n>—setErris expected to still be-25205(kAXErrorAttributeUnsupported, the known-brokenAXManualAccessibilitypath).fallbackSetErr=0means theAXEnhancedUserInterfacefallback succeeded — that's the fix working.roster poll tick=K: ... titleRefreshed=true— confirms the meeting title actually populated (vs. staying empty and falling back to a generic "Meeting" filename).- If the chat toggle is on and the chat panel was open:
roster poll tick=K: chat read=N messages. - If title/roster still come back empty after several ticks, the log emits up to 3 AX
tree dumps (
roster poll tick=K: readRoster empty — AX tree dump (n/3): ...) — a bounded outline (role, identifier, description, truncated value) of Teams' real AX tree. Capture and share these — they're exactly what's needed to retuneRosterReader's (and, if chat was on and still empty,ChatReader's) hardcoded identifiers against real Teams output, the same wayRosterReaderwas originally tuned. - In the final transcript
.mdfile:- Filename should use the real meeting title, not "Meeting".
- If chat was on and messages were sent, look for lines like
[mm:ss] _**Chat — <Sender>:** ...text..._interleaved chronologically with the speaker segments.
Paste back:
- The full
enableMeetingAppAccessibility/roster polllog lines for that meeting. - Any AX tree dump lines, if they appeared.
- The relevant portion of the generated transcript (filename + any chat/title lines).