Queue Release Build / prepare (push) Successful in 1m3s
Deploy Web Apps / deploy (push) Successful in 12m28s
Queue Release Build / build-windows (push) Successful in 32m9s
Queue Release Build / build-linux (push) Successful in 54m12s
Queue Release Build / build-android (push) Successful in 21m27s
Queue Release Build / finalize (push) Successful in 5m11s
Require a short user interview before implementing bugs/features, and overwrite or clear HANDOFF.md so it never accumulates session history. Co-authored-by: Cursor <cursoragent@cursor.com>
61 lines
5.1 KiB
Markdown
61 lines
5.1 KiB
Markdown
# 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
|
||
|
||
- Keep `NgOptimizedImage` off 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:sync` after editing any `public/i18n/catalog/*.json` file — `[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]`
|
||
- Canonicalize direct conversation ids across cross-signal actor aliases — `[direct-message] [identity]`
|
||
- 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:fix` over 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/` + targeted `electron/` + 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]`
|
||
|