Tuesday, 26 May 2026

Daily Work Summary

A high-output day spent almost entirely on two trust-spine marketplaces. On Dari (Stellify/Hortensia stack) I closed out the §R33 UI-first slice ladder — wiring the viewing-booking front end and lifecycle jobs (U4 Batch 2), building the entire deposit/transaction surface across buyer, seller and admin (U5), shipping two-way mutual-blind reviews (U6), then a non-fiscal receipts pipeline (P1-30) and a multi-channel notification dispatch substrate (P1-33/34). On Kollabo I drove the plan-28 cold-start spine to completion and beyond: messaging over the lifted Socket.IO relay (U7), contracts + concierge activation + deliverables (U8), real Stripe escrow funding/payout/refund (U9), two-way reviews + full dispute lifecycle with money movement (U10), the notification dispatch spine (U11), money/cron hardening (idempotency sweeper + escrow reconciliation + trust snapshot), and creator Stripe Connect Express onboarding. Smaller passes: glowit mobile i18n repair (≈280 missing keys, slug-keyed category translation, phone-input styling), and a Stellify marketing-hero rebuild into a 3D coverflow with mobile carousel tuning. The remaining repos show large but near-symmetric uncommitted diffs — line-ending/whitespace re-normalization churn, not feature work.

14
Projects
108
Commits
4,647
Files changed
+1,225,306
Insertions
−1,207,703
Deletions

Open problems & next steps

Everything below is shipped booted-but-inert behind feature flags — nothing is live until these gates close. This is the pick-up list for tomorrow.

Dari — feature flags & pre-prod gates
Kollabo — financial gates & ops
glowit / Stellify

dari

42 commits · Turborepo (@dari/lib + apps/web + packages/db) · Tunisian rental trust-spine · it-team-orchestrator-run

Completed the §R33 UI-first slice sequence and opened the post-spine backlog. The day moved through four big verticals: U4 Batch 2 (viewing-booking UI + BullMQ lifecycle/reminder jobs), U5 (the full deposit/transaction surface — buyer reserve→pay, seller accept, admin dispute-resolve via a cookie→admin-bearer mint), U6 (two-way mutual-blind reviews), P1-30 (non-fiscal receipts with gapless numbering + Chromium PDF render), and P1-33/34 (a multi-channel notification dispatch substrate that finally lights up the delivery stubs U3/U4/U6/P1-30 all deferred). Every slice is no-schema-where-possible, FF-gated default-OFF, and money-paths emit as STRING centimes with anti-oracle 404s throughout.

Backend

  • Viewing lifecycle (U4 B2): new VIEWING_SCHEDULED queue + pure-DI viewing-lifecycle-sweep (CAS-guarded markTerminal, CONFIRMED→COMPLETED/BOOKED→NO_SHOW) and viewing-reminder processors; syncViewingReminders post-commit best-effort enqueue (deterministic jobId, remove-then-add) wired into the book POST + PATCH routes. Booted-inert behind FF_VIEWING_BOOK_ENABLED.
  • Transaction reads + reserve entry (U5): pure @dari/lib/transactions/serialize (5-stage timeline, deriveCallerRole, money-as-string DTOs); GET /transactions + GET /transactions/[id] (party-gated, 404 anti-oracle); POST /listings/[id]/reserve-request (server-derived parties, withMinTier(T2) + FF_DEPOSITS_ENABLED + idempotency + (listing,buyer) partial-unique).
  • Admin dispute triage (U5 B2b): POST /api/v1/auth/admin-bearer — cookie→short-lived (15m, access-only) admin-bearer mint, CSRF-defended via custom x-dari-admin-mint header + Origin allowlist, isAdmin re-read from DB per request; listDisputedTransactionsForAdmin (urgent-first, omits forensic note).
  • Two-way reviews (U6): @dari/lib/reviews with blind-release confidentiality (PENDING counterparty → presence flag only), dual-submit atomic flip under the transaction:{id}:state advisory lock, direction-dedup (folded logic-eval F-01 BLOCKER), + a 14-day window-close sweep job.
  • Receipts (P1-30): immutable Receipt + per-year gapless ReceiptSequence (forward-only migration); triple-layer idempotency (FOR-UPDATE + in-lock paymentId re-check + P2002 catch); outbox-driven issue→render workers (Chromium via dynamic-imported playwright-core → MinIO); read/download(presigned)/email(own-address-only) routes.
  • Notification substrate (P1-33/34): Notification + NotificationPreference schema (11 categories × 3 criticality tiers); @dari/lib/notifications dispatcher over Expo push + Resend email with server-derived criticality, per-category prefs, quiet-hours defer-not-drop, critical-bypass, and per-channel idempotency markers; booted-inert worker. Reused the pre-existing global opt-in/quiet-hours substrate rather than duplicating it.

Frontend / user-visible

  • Viewing surfaces: /viewings booker list, /viewings/availability/[listingId] host calendar (Tunis-offset pinned, host-only→404), /viewings/host approval inbox + auto-confirm toggle, and BookViewingButton wired into StickyCtaDock (T2×T2 only).
  • Deposit/transaction journey: request-to-reserve CTA, status+timeline page, role-tabbed transaction list, TransactionActions (seller accept/decline, buyer place-deposit with pre-redirect confirm, dispute consequence gate), and DepositReturnPoller that polls the authoritative GET and ignores the PSP redirect hint (with an aria-live notice after 2 network misses).
  • Admin dispute console at (ops)/admin/disputes — two-step consequence gate echoing amount/party/reason, version-CAS, idempotency-key reuse across one 401 force-remint.
  • Reviews UI: accessible StarRating radiogroup, blind-release notice form, 5-state ReviewsSection on the transaction page, profile reviews panel.
  • Receipt card on the transaction page (pending / generating / ready states, dir=ltr-wrapped money, download + email actions).
  • i18n: new viewings, transactions, admin.disputes, reviews, receipts namespaces ×4 locales (en/fr/ar-MSA/tn-Tunisian), RTL logical props throughout.
Notes: All slices verified pnpm type-check 7/7 green with unit tests (viewing +16, transactions +18, reviews +28, receipts +26, notifications +36). Evaluators ran as subagents — mostly ACCEPT round-0, with folded findings on each. Integration/e2e specs authored but execution Docker-pending.

kollabo

52 commits · Turborepo (apps/web + apps/socketio-server + services/worker + packages/lib/db) · creator↔business marketplace · plan-28 ladder, orchestrator-run

Drove the plan-28 cold-start spine to completion (U7→U10) and added two post-spine rungs. The thread: U7 messaging on the lifted Socket.IO relay (with a load-bearing fix — the relay's UUID-only threadId regex silently dropped every cuid Conversation.id), U8 contracts/sign/concierge-activation/deliverables, U9 real Stripe escrow funding→payout→refund (the provider stubs went from NOT_IMPLEMENTED_WAVE2 to implemented), U10 two-way reviews + full dispute lifecycle that moves escrow money by reusing the U9 primitives verbatim, U11 the notification dispatch spine, then money/cron hardening (idempotency sweeper + escrow↔Stripe reconciliation + trust snapshot) and creator Connect Express onboarding (closing the top U9 OWED item). No schema changes anywhere — every model pre-existed.

Backend

  • Messaging (U7): persist-first-then-publish send path (REST writes Message → Redis chat:thread:{id} → relay fans out); conversation-service with membership gate (404 anti-enum) + counterparty-PII-allowlist; SAFE_THREAD_ID cuid-accepting regex fix in socketio-server.
  • Contracts (U8): IDOR access spine (classifyParty), HMAC-hashed signature provenance, idempotent sign, TOCTOU-safe concierge activation, and a bounded deliverable submit/revision/approve loop — 8 mirrored /api/v1 routes with withRoleStrict (no silent ADMIN auto-pass).
  • Escrow money path (U9): integer-exact money.ts (currency-exponent + zero-drift share split), implemented Stripe createPaymentIntent/createTransfer/createRefund; fund/refund/payout services + payout-dispatch and stripe-escrow-event Outbox workers; 4-layer idempotency (HTTP key / Outbox / Stripe key / ledger unique). Webhook route broadened to the escrow event family.
  • Disputes (U10): full lifecycle (open→triage→request-evidence→resolve→escalate); resolveDispute moves money via the U9 release/refund primitives (refund-before-status-claim ordering, status-guarded flips); paired-reveal reviews with compute-on-write trust metrics; FeatureFlag-gated repeat-offender auto-suspend; public /trust stats computed on demand.
  • Notification spine (U11): notification:dispatch Outbox worker → IN_APP (Socket.IO) + EMAIL (Resend), per-channel idempotent delivery logs, money-safe two-mode emit (in-tx for non-financial, post-commit try/catch-guarded for escrow/payout so a notification can never roll back a money txn — caught + fixed an F-1 violation mid-build). 4 domain events wired.
  • Money/cron hardening: idempotency-key sweeper (flips stuck-PENDING→FAILED, fail-CLOSED kill-switch, never deletes PENDING); read-only escrow-ledger↔Stripe BalanceTransaction reconciliation (drift classification, redacted IDs); nightly trust-snapshot; admin drift-read route + incident runbook.
  • Connect onboarding: Stripe-hosted Express onboarding (Account Links), account.updated/deauthorized webhook → single-writer gate-sync worker, 3 /api/v1/connect/* routes (session-only account derivation, zero business disclosure of acct_*).

Frontend / user-visible

  • Messaging: /messages thread list + /messages/[id] realtime thread view with optimistic-send tick states, id-deduped echo, typing, mark-read, and a role=log aria-live stream.
  • Contracts: /contracts list + detail with sign-panel (attestation gate), milestone deliverable submit/review cards, and an admin concierge-activate control.
  • Escrow: Stripe Elements fund-panel, escrow status panel with per-milestone payout rows, and a creator /creator/payouts page; creator Connect payout-setup panel + status badge.
  • Reviews & disputes: star-rating + review forms, dispute thread/composer + open-dispute form, the ops resolution wizard (creatorPercent shown, required only for PARTIAL), and the /trust public stats block.
  • i18n: new messaging, contracts, escrow, reviews/disputes/trust, notifications, connect namespaces ×en/fr/ar, logical-only RTL, OpenAPI regenerated each slice.
Notes: Full web suite grew 1138→1238 tests green across the day; worker 72/72; lib ~669 (only the 4 pre-existing testcontainer files fail, Docker off). Phase-0 research + Phase-5.5 evaluators ran as subagents where the env allowed (logic + authz ACCEPT on the money paths); financial slices carry the /ultrareview + 2nd-senior recommendation before merge. All work is uncommitted/staged per the slice posture.

glowit

5 commits · React Native / Expo (apps/mobile) · salon-booking app

A focused mobile i18n repair pass. About 280 keys were referenced via t() but absent from the locale files, so they rendered the inline English default (or raw key strings) in every locale — including search-bar placeholders and all 20 salon category slugs. Fixed the data and the two code-side resolution bugs that broke category translation, plus a phone-input restyle.

Frontend / user-visible

  • Added the ~280 missing keys to en/fr/ar/tn and closed pre-existing parity gaps (11 fr, 22 ar, 12 tn) — all 4 locales now hold an identical 4,281-key set, and the keys are now editable from the admin translation dashboard.
  • Removed the drifted API_SLUG_TO_CATEGORY table in CategoryPillsNav and resolved labels directly via t(\`${ns}.${slug}\`); added a categorySlug field to Service/AvailableService so service-category chips translate on salon-detail and the booking picker.
  • Fixed the owner-dashboard "Appearance" menu item resolving to a raw key (pointed at owner.appearanceLabel), and restyled PhoneInput to match sibling form fields (border, radius, 16px font, dropped iOS lineHeight hacks).

stelify-turbo

9 commits · Turborepo (apps/web) · Stellify SaaS (music/artist platform)

A presentation-layer day on the marketing hero plus mobile carousel polish and small hydration/i18n fixes. The ranked-artist carousel was rebuilt twice into a 3D coverflow — first a spotlight that follows hover/auto-cycle, then a full cylinder/ring with proper pointer hit-zones — and the mobile track surfaces were tuned to match the app layout.

Frontend / user-visible

  • Marketing hero (marketing-hero.tsx): desktop ranked artists now render together in a 3D Cover Flow with a spotlight; New Stars sit on a rotating cylinder; split into non-interactive 3D visual layers + flat hit-zone bands so hover/click always register; honors prefers-reduced-motion. Later dropped the heavy primary-glow halo on the active card.
  • Mobile carousel fixes: killed a global * { transition: transform } rule animating embla's instant loop repositions (!transition-none on the shared Carousel primitive); made the "simple" track card match the app's image-on-top/metadata-below layout below sm; tuned the Latest Songs carousel (compact see-all pill, stopOnInteraction:false so autoplay resumes after swipe, mobile-fit slides).
  • Fixes: merged a duplicate app.pages.error block in en.json that left the 500 page rendering raw keys; deferred the ?period= nav query param until after mount to resolve a hydration mismatch.

Planning (no code)

  • Folded plan-evaluator R2 corrections into the multi-role booking master plan: SetupIntent-at-request + off-session charge-on-accept (replacing pay-after-accept-48h), fixed-point gross-up sized to worst-case card mix, currency + Connect-country elevated to a Step-0 blocking gate, business-confirmed completion, two-sided BookingReview. Confidence 8.5→8.7.

Repository churn & environment (uncommitted)

No feature commits — these repos show working-tree changes only, and the diffs deserve scrutiny before any commit.

  • Whitespace / line-ending re-normalization (likely no real change): movom (+622,675/−622,624, 182 files), primavera (+166,788/−166,448, 722 files), thryve (+274,477/−274,471, 840 files), wamya (+44,276/−44,276), stelify_V2 (+46,163/−46,163), and autoflow/claude-contexts (+25,490/−25,314, 104 files) all show near-symmetric insert/delete counts across whole files — the signature of CRLF↔LF or trailing-whitespace re-normalization, not edits. Verify and discard rather than commit.
  • project-curve-v3-react (+458/−26,009, 1942 files): a large deletion of the committed build/ directory (generated assets) plus a new package-lock.json — looks like dropping a checked-in build output.
  • Untracked tooling / local state to clean up: autoflow has a .mempalace-trial/ Chroma DB + hook scripts; several repos have new .claude/settings.local.json, pnpm-workspace.yaml, seed files, and a stray nul (thryve) / screenshot scripts. stelify-turbo has a .claude/scheduled_tasks.lock. None belong in a commit without review.