Queue Release Build / prepare (push) Successful in 28s
Deploy Web Apps / deploy (push) Failing after 10m14s
Queue Release Build / build-windows (push) Failing after 15m12s
Queue Release Build / build-linux (push) Successful in 43m41s
Queue Release Build / finalize (push) Skipped
Queue Release Build / build-android (push) Successful in 17m25s
Not tested enough but works on my machine
7.2 KiB
7.2 KiB
Agent Lessons — Index
Session start: read this file only. Match tags to the task. Open the matching lesson body in agents-docs/LESSONS.md — do not load every lesson.
When adding a lesson: append the full entry near the top of LESSONS.md (under ## Lessons) and add one bullet here.
Tags help grepping: rg '\\[attachments\\]' agents-docs/LESSONS-INDEX.md
Index
- A hold-on-unknown rule needs every attach site behind it —
[voice] [webrtc] [realtime] - Swap a live device with
replaceTrack; an empty device list is missing evidence —[voice] [webrtc] [devices] - One owner for a toggle the UI mirrors —
[voice] [state] [ui] - A timed-out sync round is not a clean one —
[messages] [realtime] [verification] - Derive a conversation id from canonical humans, never from the ids on the wire —
[direct-message] [identity] - Report whether a call event was delivered before showing a live call —
[direct-call] [verification] - Never spend a retry budget on attempts the transport cannot deliver —
[realtime] [recovery] - Repair a dead data channel on the live connection before rebuilding the peer —
[realtime] [webrtc] [recovery] - Compare peer ids only within one signal server's identity space —
[realtime] [identity] [webrtc] - Reproduce initiator/glare bugs with a simultaneous reconnect, not staggered joins —
[testing] [realtime] [webrtc] - Keep
NgOptimizedImageoff runtime blob and data URLs —[angular] [images] - Read the exact Obsidian bug note for
fix bug "…"(one note only) —[workflow] [bugs] - Run
npm run i18n:syncafter editing anypublic/i18n/catalog/*.jsonfile —[i18n] [testing] - Match direct-call recipients against every local identity alias, exactly like DMs already do —
[direct-call] [identity] - Resolve outbound direct-call recipient ids to the peer's connected signal identity —
[direct-call] [identity] [signaling] - Decide attachment receive admission once at request time; never re-gate size in the chunk handler —
[attachments] - Re-queue attachment auto-downloads on every message/room binding event; never trust one transport's ordering —
[attachments] [realtime] - Scope per-user UI state by user id, not by the client database —
[persistence] [multi-user] [custom-emoji] - Don't strand signed-out mobile users on a logged-out dashboard —
[auth] [mobile] [routing] - "Shared from your device" must gate on local bytes, not uploader user id —
[attachments] [multi-device] - Generate Android brand icons from the source mark; guard against stock Capacitor placeholders —
[mobile] [android] [assets] - Bind chat attachments to a pre-allocated message id, never by matching content —
[attachments] [chat] [mobile] - Attachment file persistence must be platform-agnostic, not Electron-only —
[attachments] [persistence] [mobile] - Never count duplicate chunks toward transfer progress, and never finalize on byte counters —
[attachments] [webrtc] - Don't bump E2E timeouts for sync flakes - gate on presence and read server logs —
[testing] [realtime] - When renaming an Angular route, sweep every navigate/url-match/doc reference —
[routing] - Server discovery must fan out across all endpoints and self-heal on 404 — never hardcode a host capability blocklist —
[server-directory] - Server registration needs
ownerPublicKey: oderId || id, and must not be fire-and-forget —[server-directory] [rooms] - Identify must fall back to the legacy session token, not only the new credential store —
[realtime] [authentication] - Keep the per-signal-URL identify credential resolvable from the store —
[realtime] [authentication] - Store clientInstanceId in sessionStorage not localStorage —
[realtime] [multi-device] - Revalidate IndexedDB scope without reinitializing on every read —
[persistence] [performance] - Restore local user scope before protected writes —
[authentication] [persistence] - Persisted local user state still requires a session token —
[authentication] [signaling] - Declare MODIFY_AUDIO_SETTINGS for Android WebRTC mic capture —
[mobile] [android] - Do not override Tailwind with box-sizing inherit —
[mobile] [css] - Use the app-shell servers rail for mobile discovery pages —
[mobile] [layout] - Defer attachment blob hydration on Electron startup —
[attachments] [electron] - Lazy-load Capacitor modules on Electron/desktop —
[mobile] [electron] - Use the upgrade transaction during IndexedDB schema migrations —
[persistence] [browser] - Wait for authenticateUser storage prep before post-login navigation —
[authentication] [browser] - Use dense arrays for chunked transfer buffers —
[custom-emoji] [webrtc] - Route custom emoji right-click through the native context menu —
[custom-emoji] [ux] - Separate known emoji assets from saved library —
[custom-emoji] [ux] - Chunk custom emoji assets over data channels —
[custom-emoji] [webrtc] - Re-clear visible notification channels after recompute —
[notifications] [startup] - Disambiguate nested chat cards —
[chat] [ui] - Use terminal Vitest when the test tool hangs —
[testing] - Do not add fake chrome around screenshots —
[website] [design] - Verify lint exits 0 before claiming done —
[verification] - Prefer
npm run lint:fixover hand-fixing lint/format —[verification] [lint] [tokens] - Use blob URLs for inline attachment previews —
[attachments] [electron] - Resolve Electron drag-and-drop file paths with webUtils —
[attachments] [electron] - Preserve uploader local attachment paths across sync —
[attachments] [persistence] - Interview before coding; don’t guess the fix —
[workflow] [bugs] [tokens] - Prove the asked behavior; unit-green is not done —
[verification] [testing] [workflow] - Default to
toju-app/+ targetedelectron/+ CI; do not crawl the monorepo —[workflow] [tokens] [scope] - Write/overwrite HANDOFF.md for new chats; clear it when the task finishes —
[workflow] [tokens] [handoff] - An outage test that only re-checks the end state is not a guard —
[testing] [verification] [webrtc] - coturn hands out a relay candidate but refuses loopback peers by default —
[testing] [webrtc] [turn] - Pin a chosen media device with
deviceId: { exact }, never a bare string —[webrtc] [media] [electron] - A second dev Electron window needs its own
--user-data-dir—[electron] [dev-shell] - Never answer
second-instanceby relaunching the app —[electron] [dev-shell] ERR_FAILED (-2)on a devloadURLusually means aborted, not unreachable —[electron] [dev-shell]- Never gate a presence indicator on the observer's own participation —
[ui] [voice] [webrtc] - Never test suspend/resume against a live-reloading dev server —
[testing] [dev-shell] [verification] - Keep diagnostic history outside the page you are diagnosing —
[testing] [verification] - Record whether the user is in a call before calling zero RTP a failure —
[testing] [voice] [verification] - Assert continuity when the state you broke repairs itself —
[testing] [voice] [verification] - Missing gossip about a peer is not evidence it left voice —
[voice] [webrtc] [realtime] app.commandLine.appendSwitchcannot disable the Chromium sandbox —[electron] [packaging] [linux]