Missing letters bug

yep.
you can see in sending operations there are 8 “createCard”
but i counted `12 in :hibiscus::hibiscus:added to queue

Card ids that were lost:
xQ_zaPxBMo4___aA_h7tV
hH4_x1wquBRMVIxloJepS
cqZCOhZAVuhr_7n-Jp3RF
AHledQM_CbvXSY9KRP_VX


here you can see that this id missing in sending operations

ok that’s a good clue and really narrows it down thx

here’s a new beta url to try: https://deploy-preview-633--kinopio-client.netlify.app/

instead of seeing ‘multiplecardsupdated’ , you’ll see a bunch of individual ‘updateCard’ operations , 1 per card being updated. This simplifies the sync logic , so let me know if this works , and if not: let me know what you see in the logs.

still missing


I filtered the console by “createCard”, and you can clearly see that the number of :hibiscus::hibiscus: “added to queue” messages is higher than the number of operations that actually appear in “sending operations”.

I also noticed that the cards that don’t make it into sending operations are usually the last ones created.

the whole log of the card that is missing

index-CohzcoDA.js:30 :hibiscus::hibiscus: added to queue createCard {position: {…}, isParentCard: true, id: ‘OUv5sP3cXDSklo8JnDQFd’, x: 481, y: 220, …}backgroundColor: "#000000"frameId: 0headerFontId: 5height: 32id: "OUv5sP3cXDSklo8JnDQFd"isComment: falseisLocked: falseisParentCard: trueisRemoved: falsemaxWidth: 390name: ""position: {x: 481, y: 220}prevHeight: 32prevWidth: 58shouldShowOtherSpacePreviewImage: truespaceId: "zwdPpdHk1iacYyI5pFF_G"urlPreviewIsVisible: trueuserId: "Xrv2X8tzMqrE3sKiQB2vH"width: 58x: 481y: 220z: -Infinity[[Prototype]]: Object undefined
index-CohzcoDA.js:30 :hibiscus::hibiscus: added to queue updateCard {id: ‘OUv5sP3cXDSklo8JnDQFd’, prevWidth: undefined, prevHeight: undefined, width: 68, height: 32} zwdPpdHk1iacYyI5pFF_G
index-CohzcoDA.js:30 :hibiscus::hibiscus: added to queue updateCard {id: ‘OUv5sP3cXDSklo8JnDQFd’, name: ‘w’, nameUpdatedAt: Sat Jul 12 2025 03:54:02 GMT+0500 (Узбекистан, стандартное время), nameUpdatedByUserId: ‘Xrv2X8tzMqrE3sKiQB2vH’} zwdPpdHk1iacYyI5pFF_G
index-CohzcoDA.js:30 :hibiscus::hibiscus: added to queue updateCard {id: ‘OUv5sP3cXDSklo8JnDQFd’, prevWidth: undefined, prevHeight: undefined, width: 68, height: 33} zwdPpdHk1iacYyI5pFF_G
index-CohzcoDA.js:30 :hibiscus::hibiscus: added to queue updateCard {id: ‘OUv5sP3cXDSklo8JnDQFd’, name: ‘wq’, nameUpdatedAt: Sat Jul 12 2025 03:54:02 GMT+0500 (Узбекистан, стандартное время), nameUpdatedByUserId: ‘Xrv2X8tzMqrE3sKiQB2vH’} zwdPpdHk1iacYyI5pFF_G
index-CohzcoDA.js:30 :hibiscus::hibiscus: added to queue updateCard {id: ‘OUv5sP3cXDSklo8JnDQFd’, prevWidth: undefined, prevHeight: undefined, width: 68, height: 33} zwdPpdHk1iacYyI5pFF_G
index-CohzcoDA.js:30 :hibiscus::hibiscus: added to queue updateCard {id: ‘OUv5sP3cXDSklo8JnDQFd’, name: ‘wqe’, nameUpdatedAt: Sat Jul 12 2025 03:54:02 GMT+0500 (Узбекистан, стандартное время), nameUpdatedByUserId: ‘Xrv2X8tzMqrE3sKiQB2vH’} zwdPpdHk1iacYyI5pFF_G
index-CohzcoDA.js:30 :hibiscus::hibiscus: added to queue updateCard {id: ‘OUv5sP3cXDSklo8JnDQFd’, prevWidth: undefined, prevHeight: undefined, width: 68, height: 33} zwdPpdHk1iacYyI5pFF_G
index-CohzcoDA.js:30 :hibiscus::hibiscus: added to queue updateCard {id: ‘OUv5sP3cXDSklo8JnDQFd’, name: ‘wqer’, nameUpdatedAt: Sat Jul 12 2025 03:54:03 GMT+0500 (Узбекистан, стандартное время), nameUpdatedByUserId: ‘Xrv2X8tzMqrE3sKiQB2vH’} zwdPpdHk1iacYyI5pFF_G
index-CohzcoDA.js:30 :hibiscus::hibiscus: added to queue updateCard {id: ‘OUv5sP3cXDSklo8JnDQFd’, prevWidth: undefined, prevHeight: undefined, width: 69, height: 33} zwdPpdHk1iacYyI5pFF_G
index-CohzcoDA.js:30 :hibiscus::hibiscus: added to queue updateCard {id: ‘OUv5sP3cXDSklo8JnDQFd’, name: ‘wqere’, nameUpdatedAt: Sat Jul 12 2025 03:54:03 GMT+0500 (Узбекистан, стандартное время), nameUpdatedByUserId: ‘Xrv2X8tzMqrE3sKiQB2vH’} zwdPpdHk1iacYyI5pFF_G
index-CohzcoDA.js:30 :hibiscus::hibiscus: added to queue updateCard {id: ‘OUv5sP3cXDSklo8JnDQFd’, prevWidth: undefined, prevHeight: undefined, width: 77, height: 33} zwdPpdHk1iacYyI5pFF_G
index-CohzcoDA.js:30 :hibiscus::hibiscus: added to queue updateCard {id: ‘OUv5sP3cXDSklo8JnDQFd’, name: ‘wqerew’, nameUpdatedAt: Sat Jul 12 2025 03:54:03 GMT+0500 (Узбекистан, стандартное время), nameUpdatedByUserId: ‘Xrv2X8tzMqrE3sKiQB2vH’} zwdPpdHk1iacYyI5pFF_G
index-CohzcoDA.js:30 :hibiscus::hibiscus: added to queue updateCard {id: ‘OUv5sP3cXDSklo8JnDQFd’, prevWidth: undefined, prevHeight: undefined, width: 88, height: 33} zwdPpdHk1iacYyI5pFF_G
index-CohzcoDA.js:30 :hibiscus::hibiscus: added to queue updateCard {id: ‘OUv5sP3cXDSklo8JnDQFd’, name: ‘wqerewq’, nameUpdatedAt: Sat Jul 12 2025 03:54:03 GMT+0500 (Узбекистан, стандартное время), nameUpdatedByUserId: ‘Xrv2X8tzMqrE3sKiQB2vH’} zwdPpdHk1iacYyI5pFF_G
index-CohzcoDA.js:30 :hibiscus::hibiscus: added to queue updateCard {id: ‘OUv5sP3cXDSklo8JnDQFd’, prevWidth: undefined, prevHeight: undefined, width: 96, height: 33} zwdPpdHk1iacYyI5pFF_G
index-CohzcoDA.js:30 :hibiscus::hibiscus: added to queue updateCard {id: ‘OUv5sP3cXDSklo8JnDQFd’, name: ‘wqerewqr’, nameUpdatedAt: Sat Jul 12 2025 03:54:03 GMT+0500 (Узбекистан, стандартное время), nameUpdatedByUserId: ‘Xrv2X8tzMqrE3sKiQB2vH’} zwdPpdHk1iacYyI5pFF_G
index-CohzcoDA.js:30 :hibiscus::hibiscus: added to queue updateCard {id: ‘OUv5sP3cXDSklo8JnDQFd’, prevWidth: undefined, prevHeight: undefined, width: 101, height: 33} zwdPpdHk1iacYyI5pFF_G
index-CohzcoDA.js:30 :hibiscus::hibiscus: added to queue updateCard {id: ‘OUv5sP3cXDSklo8JnDQFd’, name: ‘wqerewqrw’, nameUpdatedAt: Sat Jul 12 2025 03:54:03 GMT+0500 (Узбекистан, стандартное время), nameUpdatedByUserId: ‘Xrv2X8tzMqrE3sKiQB2vH’} zwdPpdHk1iacYyI5pFF_G
index-CohzcoDA.js:30 :hibiscus::hibiscus: added to queue updateCard {id: ‘OUv5sP3cXDSklo8JnDQFd’, prevWidth: undefined, prevHeight: undefined, width: 112, height: 33} zwdPpdHk1iacYyI5pFF_G
index-CohzcoDA.js:30 :hibiscus::hibiscus: added to queue updateCard {id: ‘OUv5sP3cXDSklo8JnDQFd’, name: ‘wqerewqrwq’, nameUpdatedAt: Sat Jul 12 2025 03:54:03 GMT+0500 (Узбекистан, стандартное время), nameUpdatedByUserId: ‘Xrv2X8tzMqrE3sKiQB2vH’} zwdPpdHk1iacYyI5pFF_G
index-CohzcoDA.js:30 :hibiscus::hibiscus: added to queue updateCard {id: ‘OUv5sP3cXDSklo8JnDQFd’, prevWidth: undefined, prevHeight: undefined, width: 120, height: 33} zwdPpdHk1iacYyI5pFF_G
index-CohzcoDA.js:30 :hibiscus::hibiscus: added to queue updateCard {id: ‘OUv5sP3cXDSklo8JnDQFd’, name: ‘wqerewqrwqr’, nameUpdatedAt: Sat Jul 12 2025 03:54:03 GMT+0500 (Узбекистан, стандартное время), nameUpdatedByUserId: ‘Xrv2X8tzMqrE3sKiQB2vH’} zwdPpdHk1iacYyI5pFF_G
index-CohzcoDA.js:30 :hibiscus::hibiscus: added to queue updateCard {id: ‘OUv5sP3cXDSklo8JnDQFd’, prevWidth: undefined, prevHeight: undefined, width: 125, height: 33} zwdPpdHk1iacYyI5pFF_G
index-CohzcoDA.js:30 :hibiscus::hibiscus: added to queue updateCard {id: ‘OUv5sP3cXDSklo8JnDQFd’, name: ‘wqerewqrwqre’, nameUpdatedAt: Sat Jul 12 2025 03:54:03 GMT+0500 (Узбекистан, стандартное время), nameUpdatedByUserId: ‘Xrv2X8tzMqrE3sKiQB2vH’} zwdPpdHk1iacYyI5pFF_G
index-CohzcoDA.js:30 :hibiscus::hibiscus: added to queue updateCard {id: ‘OUv5sP3cXDSklo8JnDQFd’, prevWidth: undefined, prevHeight: undefined, width: 134, height: 33} zwdPpdHk1iacYyI5pFF_G
index-CohzcoDA.js:30 :hibiscus::hibiscus: added to queue updateCard {id: ‘OUv5sP3cXDSklo8JnDQFd’, prevWidth: undefined, prevHeight: undefined, width: 134, height: 33} zwdPpdHk1iacYyI5pFF_G
index-CohzcoDA.js:30 :hibiscus::hibiscus: added to queue updateCard {id: ‘OUv5sP3cXDSklo8JnDQFd’, prevWidth: undefined, prevHeight: undefined, width: 134, height: 33}height: 33id: "OUv5sP3cXDSklo8JnDQFd"prevHeight: undefinedprevWidth: undefinedwidth: 134[[Prototype]]: Object zwdPpdHk1iacYyI5pFF_G

The :hibiscus::hibiscus: “added to queue” cards that don’t make it into the first “sending operations” batch also don’t appear in any of the subsequent ones.

So it looks like they’re being removed (filtered out) from the batch based on some criteria.

Just to recap — these are always the last items in the queue right before a “sending operations” batch is triggered.

It’s intentional that you’ll see more ‘added to queue’ messages than queue items sent out. If you type in the letters x,y, then z in a card you only need one update for the final card name of ‘xyz’

I’ll look into these logs to see if any data is missing. Let me know if any actual cards or names are missing as well

Yes cards are Missing

  • WHEN I: add card in kinopio

  • IN CONSOLE: :hibiscus::hibiscus: “added to queue” createCard APPEARS

  • The number of added cards = the number of :hibiscus::hibiscus: “added to queue” createCard operations.

  • EXAMPLE: 4 created cards = 4 of :hibiscus::hibiscus: “added to queue” createCard

  • BUT SENDING OPERATIONS dont include some of cards that were in :hibiscus::hibiscus: “added to queue” createCard

  • EXAMPLE: 8 created cards = 8 :hibiscus::hibiscus: “added to queue” createCard BUT ONLY 6 of them Appears in SENDING OPERATIONS

  • AS A RESULT: 2 CARDS WILL BE MISSING ( 8-6 = 2 )

:bangbang: If I’m not logged in deploy-preview-633–kinopio-client.netlify.app and I create cards in a guest space, the cards don’t disappear.

i guess because there are no SENDING OPERATIONS

ok I basically went and rewrote/simplified the whole sync system. I’ve noodled with it but haven’t fully QAed this yet but I feel decently confident :),

use the beta url to validate it:

https://deploy-preview-633--kinopio-client.netlify.app/

tech notes:

This fixes an race-condition bug with syncing, causing updates to not be added to the queue if they arrived too fast.

The issue was that queue updates were being saved directly to indexeddb (idb), but idb saving is slow and async so the queue would send before the last updates to the queue had completed saving. (And those late updates never appeared to save because the queue is cleared after sending.)

Basically I fixed the race condition by using a local sessionQueue var and only saving to the real idb cache when queue sending starts.

Also instead of saving every item to the queue and squashing and sort it at send time, I’m doing a simpler shallow merge right as the item is added to the queue. This is a lot simpler to understand and debug because it lets me compare the state of the sessionqueue before, and right after, a queue item is added.

PR: https://github.com/kinopio-club/kinopio-client/pull/633

I tested it several times, and in the new version, fewer cards disappear comparing to current live version, but they still do disappear.

A lot of them disappeared when I hit reload immediately after finishing creating the cards.

The numbers below show how many cards remained out of the total I created.

New version:

  • 15/16

  • 10/10

  • 31/33

  • 9/10

  • 7/8

  • 11/15 - instantly refreshed

  • 4/10 - instantly refreshed

  • 15/15 but some letters are missing

  • Current version:

  • 9/12

  • 23/36

  • 7/10 instantly refreshed

  • 8/8 lettersmissing

  • 10/15

1 Like

If you refresh after immediately refreshing let me know if the cards appear. This is because it takes time for the cards to be saved to the server , it’s not a sync bug and can be fixed separately later

image

You can see that the connector attachment point is still visible (with color), but the connector itself is missing - because the card disappeared after the refresh.

“If you refresh after immediately refreshing let me know if the cards appear. This is because it takes time for the cards to be saved to the server , it’s not a sync bug and can be fixed separately later”

nope

1 Like

This still meets my acceptance criteria for shipping , it can be refined as more bug reports come in or I figure out how to repro. But I’m out of bug fixing time for now so I’ll have to revisit in a couple weeks

https://deploy-preview-633--kinopio-client.netlify.app/
did you ship it?

aint there no way to run kinopio offline?

feels like https://deploy-preview-633--kinopio-client.netlify.app/ update is still not live

i just shipped it a couple seconds ago

1 Like