OctoMonic S.O.S ANIMALS · DOG CAMP 7 Jul 2026

State of the Union — the system is stable, and re-launched

What broke, what's fixed, why it can't come back, and the two calls Daniel still needs to make.

The new normal — how it works now

The whole problem was the old design: every phone read and wrote the entire camp state as one shared document, directly to the database. A single stale phone could overwrite everyone. We moved the source of truth onto a server that mediates and authorizes every write.

Before (the failure)

  • Every phone wrote the whole shared blob directly to the database.
  • No login for anyone — the app was open.
  • A parent's phone could (and did, Jul 6 14:50) overwrite the schedule, groups, and attendance with its stale copy.
  • Any device could mark any kid in any group — counts drifted silently.
  • Old cached apps kept writing outdated data.

After (today)

  • All writes go through OctoMonic's server, which owns the data.
  • Staff & volunteers log in (phone + password); 2 admins (Tom, Daniel).
  • The server checks every field against the person's role — unauthorized changes are dropped, not trusted.
  • Attendance is validated against the real roster.
  • Outdated apps are refused and force-updated.

Under the hood: 16 of the app's data domains were also moved out of the shared blob into proper database tables (blob shrank ~740 KB → 75 KB), so reads and writes are scoped per-record instead of whole-document.

What shipped tonight all live & verified

Parent flow restored

The re-architecture had accidentally broken parents' ability to add notes/photos. Rebuilt: a parent enters their phone, gets a session scoped to their own children, and can edit their kids' notes/photos — and nothing else. Verified end-to-end on the live system.

Three security gaps closed

Anonymous writes blocked, a real minimum-version gate added, and attendance now validated against the roster. Details in "Why the bugs can't return" below.

Attendance corrected

5 bad marks (1 phantom, wrong-group, duplicates) removed. True present: Day 2 = 96, Day 3 = 93 (+1 each pending one Daniel call). The root cause is now blocked server-side.

Fresh URL + clean slate

New address summercampsos, old one auto-forwards, and every stale app is force-updated to the current version. "This is the new system" — as intended.

Why the bugs cannot return

We've had this conversation before and I was wrong then — so this time it's four concrete server guarantees, each with the live proof I ran against the real system tonight. The point is not "we tested more"; it's that the class of failure is now structurally impossible, not just fixed.

1 · Phones cannot write to the database directly.
Every write goes through the server and requires a valid login session. This kills the entire "a stale phone overwrote everyone" family of bugs at the root.
anonymous write → 401 unauthorized ✓
2 · Each person can only change what they own.
The server authorizes every individual field. A parent can edit only their own child's notes/photos; the schedule, other children, staff, and admin data are rejected. This is exactly the Jul-6 14:50 incident (a parent's phone rewrote the schedule + groups) — now impossible.
parent → own child's note: saved · schedule + other child: dropped ✓
3 · Outdated apps are locked out.
The server refuses any app older than the required version; the app then busts its cache and force-reloads to the latest. No stale client can keep writing old data — you don't need to know who's using it.
old app (10.90) → 426 upgrade_required · current (10.91) → 200 ✓
4 · Attendance can only be marked for a real kid in the right group.
The server checks every attendance mark against the roster and rejects wrong-group or non-existent students. This was the actual cause of the drifting head-counts (e.g. a child marked in a group they're not in).
wrong-group / phantom mark → rejected server-side ✓

Honest limit: the one thing software can't decide for us is human judgment — e.g. which group a child actually belongs to. Where the roster itself is ambiguous, that's flagged for Daniel below rather than guessed.

Everyone who needs a login has one 50 / 50 — full coverage

RoleWhoLogins
Group instructors1 per group (g1–g7)7
Young-trainer volunteers (משמריסטים)every active volunteer33
Core staffmanagers / coordinators5
Stationsentry · photos · logistics3
AdminsTom, Daniel2
Total50

All 50 credentials are minted and sit in a private click-to-copy sheet for Daniel (one tap copies a ready-to-send login message per person). It is not published here — it holds passwords. Everyone is prompted to set their own password on first login. Daniel: distribute before next camp day

Parents — what they can and can't do

They keep doing what they did before ✓

No login. They enter the phone their child is registered under, see their kid(s), and can add/edit notes and photos. It saves to the server and persists — verified live. They also see their child's full schedule and info (reading was never restricted).

What they can no longer do (by design)

They cannot edit the schedule, other children, groups, or staff data — those writes are dropped by the server. This is the change that makes the Jul-6 incident impossible. Seeing the schedule ≠ editing it.

Photos — the one thing we can't fully fix in software needs retakes

When the project was migrated (~3 weeks ago, before us) the old storage was deleted. 65 photos point at that deleted storage and are unrecoverable — 0 can be restored by us (verified against current storage). They've been broken in the app for weeks; the migration faithfully carried dead links. The 26 working photos (current project + Google Drive) are fine.

Possible shortcut before reshooting: 14 orphaned image files still sit in current storage under an old restore/ folder with no links pointing to them. They may match some of the 65 — worth a quick visual check before retaking those.

Retake list — 65 photos

CategoryCount
Students28
Volunteers (משמריסטים)22
Dogs8
Staff4
Group instructors (אנה g2 · מרגריטה g6 · לי g7)3

Full name-by-name list (grouped) is ready for Daniel — the photos station login (station-photos) is the fastest way to reshoot them in-app.

What Daniel needs to do

  1. Distribute the logins from the credential sheet before the next camp day — nobody can log into the new URL without them.
  2. Decide one child's group: מישל שהם is filed in group g1 but her attendance is recorded under g6. Which group is she actually in? (This is the "+1" on the Day-2/Day-3 counts.)
  3. Confirm ~6 withdrawals: group g1 is padded to 22 kids while every other group has 13–14; 6 of them have never attended any day. If they've left the camp, they should be removed from the roster (brings the active roster to a clean ~98).
  4. Retake the 65 photos (after checking the 14 orphaned files for matches).

Items 2 & 3 are human calls only Daniel/the instructors can make — the data is ambiguous and I won't guess with real children's records. Everything else is done.

OctoMonic · prepared for Tom Levi · 7 Jul 2026 · all claims verified live against the production system.