Instruction file imported from gordo-v1su4/pindeck (
.cursor/rules/changelog.mdc). Copyright stays with the author.
description: Session-by-session changelog for significant project updates globs: */ alwaysApply: true
Pindeck Changelog
Use this file as a concise running log of meaningful changes.
Entry format
## YYYY-MM-DD
- Area: short summary
- Area: short summary
- Follow-up: pending item or risk
Rules:
- Keep bullets short and concrete.
- Log shipped behavior, not intentions.
- Include follow-ups only when actionable.
- Prefer one section per day.
2026-09-19
- Upload-clutter purge (ops):
internalPurgeUploadClutterForUserremoves E2E-tagged pending/draft/processing rows only; full account wipe requiresPURGE_MODE=entire-account+ explicit confirm (scripts/purge-owner-library.sh). - E2E smoke fixture: defaults to a PNG from
~/Downloads(unique temp URL per run); Wikimedia pool is fallback only. - Orchestration → Upload UI sync:
completeCallbackand cached orchestration replays setimages.aiStatuswhen Trigger finishespindeck-image-refresh/pindeck-generate-variations;reconcileMyOrchestrationAiStatusbackfills rows where orchestration is terminal but Upload still shows processing. - Production black screen fix: Restored wire path
images:listvia rootconvex/images.tsbarrel after V1S-84 split (nested modules only hadimages/library:list).check-pindeck-convex.shnow fails ifimages.js:listis missing from deploy. - Platform docs: Single map
docs/architecture/platform-topology.md; trimmed duplicates; removed staledocs/guides/redesign-deck-port-inventory.md. - Convex ingest fix:
ingestExternalHttpuses nestedinternal["images/ingest"].ingestExternalref (shim path broke production/ingestExternal). - E2E:
scripts/e2e-production-smoke.sh, Playwrighttests/e2e/default base URLhttps://pindeck.dev; npm scriptse2e:smoke,e2e:ui. Smoke probes unauthenticated/orchestration/*callbacks (expect401). - Convex orchestration fix: All Trigger HTTP callbacks and media paths use
internalApi.images.*fromshared.ts(orchestration.ts,mediaStorage.ts,images/analysis.ts,images/lifecycle.ts) — fixes productionCouldn't resolve api.images.internalGetMetadataRefreshPayloadon external-ingest / image-refresh. - Ops: Trigger
20260919.1deployed on app-vm;/opt/pindeckreset toorigin/main. - Convex deploy (V1S-84 follow-up):
internalApi.imagesshim inconvex/images/shared.ts; production deploy tohttps://convex.serving.cloudrestored. - Arch-4 + Arch-5: Merged PR #39 — Trigger orchestration seam (
orchestrationSeam/orchestrationCore/orchestrationState) + media adapter (lib/mediaAdapter.ts,mediaAdapter.ts); rebased on main including Convex shim.
2026-09-18
- Convex ops: Document two Hostinger stacks (
pindeck-convexvsreview-room-convex/ Unfold). Pindeck deploy +scripts/check-pindeck-convex.shtargetconvex.serving.cloudonly;enforce-production-convex.shrejectsunfold.serving.cloudURLs. - Arch-5 (V1S-87):
convex/lib/mediaAdapter.tsowns canonical paths + public URL formulas;convex/mediaAdapter.tsre-exports. Tests inconvex/lib/mediaAdapter.test.ts. - Arch-4 (V1S-86): Trigger orchestration interface —
orchestrationSeam.tsHTTP paths,orchestrationCore.tskeys/status,orchestrationState.tslease mutations.triggerDispatchstays the SDK layer. Payloads unchanged; redeploy Trigger workers after merging seam imports (bun run trigger:deploy). - Greptile #38: bot withdrew
.filter/.collectas merge blockers (legacystatus: undefined+ full-library aggregations). Typedshared.tsctx in27bb6e4. Follow-up:by_statusindex + status backfill (schema deploy; not V1S-86). - Images shared types (V1S-84):
convex/images/shared.tscleanup/lineage helpers takeMutationCtx/QueryCtxinstead ofany. - Arch-3 (V1S-85): removed unused Radix
ImageGrid+TableViewand exclusive siblings (ImageModal,EditImageModal,GenerateVariationsModal,CategoryFilter).App.tsxstill wirespd/GalleryView+pd/TableView. Palette re-sample / parent lineage already live there and inImageDetailDrawer; dropped unused@dnd-kit/*+@tanstack/react-table. - Images backend (V1S-84): split
convex/images.tsintoconvex/images/(library,ingest,moderation,lifecycle, plus uploads/analysis/generation/shared).index.tsre-exports soapi.images.*and HTTP imports from./imagesstay the same. - App shell (V1S-83 slice 1): moved Topbar + Sidebar (filters, aggregations, color picker) to
src/components/shell/with no behavior change;App.tsxstill wires auth, library query, and routes. - App shell (V1S-88): view, library filters, and table column visibility live in
src/components/shell/hooks (useAppView,useLibraryFilterState,useTableColumnVisibility);App.tsxremains the auth + route shell. - Agents docs: Committed
docs/agents/*+.agents/skills/implement/SKILL.md+matt-pocock-workflow.mdso implement threads find ticket workflow without plugin-only skill paths. - Linear: Pindeck project + arch epic V1S-82 (children V1S-83–87); repo index
docs/agents/architecture-linear-backlog.md. V1S-83 in progress (App shell). - Agents: Pindeck uses Matt Pocock skills + Graft only; pstack not used in this repo (uninstall via Cursor Customize → Plugins if enabled for this workspace).
- Matt Pocock agent setup:
docs/agents/issue-tracker.md(GitHub/gh),docs/agents/domain.md(single-context);## Agent skillsinAGENTS.md. No triage labels untiltriageskill is installed. - Graft: Per-repo Hermes setup —
@nanonets/graft@0.18.0devDependency,trustedDependenciesfor tree-sitter,bun run graft:build/graft:map, Cursor MCP viabunx graft mcp; commit.cursor/rules/graft.mdc, hooks, andmcp.json(notgraft/).
2026-07-05
- Auth UI: Removed Google/GitHub sign-in buttons from
SignInForm; OAuth env vars are not configured. Email/password and guest sign-in remain. Backend OAuth providers stay inconvex/auth.tsfor future enablement. - Deck composer persistence:
decks.updatesaves composer state (blocks, palette, scroll FX, overlay, typography, slides) to Convex with debounced autosave + Saving… / Saved indicator inDeckComposer; legacylocalStorageis a UI-only cache for selection index. - Image delete/edit auth:
images.remove/removeMany/updateImageMetadatarequireuploadedBy === userIdor admin (ADMIN_USER_IDS/ADMIN_EMAILSenv); shared active library images are no longer deletable by any signed-in user. - HTTP security:
/smartAnalyzeImagerequiresINGEST_API_KEYBearer auth and verifies image ownership before scheduling analysis. - Lineage:
getLineagereturns parent/children for active library images, not owner-only. - Library query: Gallery + Table share one
images.listlimit 1000 subscription fromApp.tsx. - App shell: top-level
AppErrorBoundary; ⌘K focuses search; removed dead Topbar Filters/Sort buttons.
2026-04-28
- Auth UI: Login brand DECK +
.auth-*accents usevar(--pd-accent*)(aligned with sidebar / Tweaks#3a7bffdefault); removed legacy#1f8fe5on.site-brand-word-accentand auth helpers inindex.css. - Build / Vercel:
VERCEL/CIchecks default prodVITE_*URLs when unset;vite.config.tsproductionVITE_CONVEX_URLfallback matchesenforce-production-convex.sh. - Convex
decks.listbugfix:ctx.db.get("images", imageId)(wasget(imageId)) sostripImageUrls/ previews populate — library strips were blank. - Deck palette: Composer prefers hero
images.colorsviapaletteFromDominantHexes(utils/colorExtractor.ts); otherwise clientextractColors.colorsno longer persisted inlocalStorage.getByIdslide images includecolorson theDeckSlidetype. - Decks library strip:
convex/decks.listreturnsstripPalettes(parallelimages.colorsslices perstripImageUrlsrow — table parity);DeckView: aspect-video hero preview +PinSwatchesper slide;previewSlideTitles+ board line. + BLANK column matches deck card width/row structure. Appdeck route wrapsmin-h-0soDeckComposersidebar + workspacemainscroll.- Deck composer: Five palette swatches prioritize client
extractColors(hero URL)first; ConvexheroDominantHexes/images.colorsonly when extraction fails (avoids stale greens from DB). Typography / GSAP Select dropdowns usedeck-composer-select-content+--pd-accent-softhighlight (ported CSS). - Deck composer UI: Tweaks accent (
--pd-accent*) drives sidebar / Present / FX / layout chips.BlockFramehas no outline in the deck preview (selection is in the block list only). Left swatches derive from the active strip image URL (heroSampleUrl); Convex fallback matchesimageUrl, not always slide 0 (activeHeroDominantHexes).EditableTextfocus rings usecolors.accent. CORS / taint:extractColorsFromImageretries via fetch → blob URL when cross-origin canvas yields too few dominants. - Decks: Restored
claude/redesignimplementation —DeckView.tsx(horizontal strip gallery + blank column + lazydeck/DeckComposer),convex/decks.tslistenrichment (stripImageUrls), shared.creative-*field/button styles inindex.css+actionStyles.ts. Removed obsoletesrc/components/pd/deck/gallery/composer. Wired inApp.tsx. - Create New Board modal (
CreateBoardModal.tsx): rebuilt on pd tokens + drawer-matching fields/footer;boards.createunchanged (name, description, isPublic). Drawer Variations: selected chips use--pd-accent-softinstead of hardcoded blue (ImageDetailDrawer.tsx). - Gallery (pd): less chrome on tiles — no aspect/style pill, no color swatches, no footer strip; VAR badge kept (slightly softer fill/border + 0.88 opacity). Heart + bookmark top-right only, hover/focus to show ( 22px buttons, 12px icons); stay visible while Save to board menu open; filled heart ~78% opacity + optimistic like; bookmark filled blue when on any board; board rows that already contain the image use muted accent background (
color-mixon--pd-accent). No wand on tiles (GalleryView.tsx). - Auth: Guest + Sign out live in the top header (
Topbar→accountActions), not the sidebar footer; sidebar footer stays convex · live only (src/App.tsx). - Image detail drawer: Variations tab shows Type/Genre/Shot/Style + tags (same fields as table/gallery); Edit metadata block adds Genre/Shot/Style; hero subtitle + chips reflect backfill metadata; variation mode labels Title Case (TMP-aligned)
ImageDetailDrawer.tsx. - Auth UI: guest/email sign-in could show a blank black main area while Convex
isLoadingwas true becauseAuthenticated/Unauthenticatedboth render nothing during load; addedAuthLoading(“Loading session…”) andshowAppChrome = isAuthenticated && !authLoading(src/App.tsx). Sanitized invalidpindeck_viewfromlocalStorage. - Library:
shotonimages; VLM analysis fills group / genre / shot / style (convex/vision.ts) andinternalUpdateAnalysispersists them. Backfill metadata in Table schedulesenqueueCinematicMetadataBackfill(your uploads only, staggered jobs). - Sidebar: Type counts, Genre + Style/medium chips, Filters (originals / sref) with shared state in
src/lib/libraryFilters.ts; wired on Gallery + Table (src/App.tsx). - Table (pd): Palette column right-aligned + Re-sample palettes on
src/components/pd/TableView.tsx(this is the table wired inApp.tsx); visual checkpoints indocs/browser-snapshots/vs pindeck.dev. - Colors: palette extraction is dominance-first (pixel share) with Lab separation (
src/lib/colorPaletteCore.ts,convex/colorExtraction.ts); sampling URL prefersimageUrl(convex/colorExtractionUrls.ts);reExtractAllrequires auth. - UI fix: accent Tweaks were ignored because
.pd-themere-declared--pd-accent*and shadoweddocument.documentElement; moved dynamic tokens to:root-only defaults + JS overrides (src/index.css). - Env: restored production Convex URLs in
.env.local(tremendous-jaguar-953) so gallery/data load against real backend (was dev deployment fromconvex dev --once). - UI: dynamic accent inks (
src/lib/pdTheme.ts), global Tweaks CSS ondocumentElement, sign-in uses--pd-accent*(parity with cloud redesign). - Drawer: TMP letterbox overlay + flex stretch fixes for
ImageDetailDrawer. - Decks gallery: accent dot meta row, TMP-style hover shadow, subtitles from Convex deck fields (legacy pd deck gallery removed; see
DeckView).
2026-02-12
- Discord ingest: strengthened media URL filtering/deduping and limited imports per trigger to reduce junk/icon ingestion.
- Discord queue workflow: imports queue as
pending; approve/deny required before full pipeline. - Discord moderation: added queue review + approve/reject/generate flows via commands/buttons.
- Discord status feedback: webhook events expanded (queued/approved/rejected/generation started/generated), with image/context metadata.
- Approved message UX: bot posts variation-mode buttons after approved status messages and routes clicks to generation.
- Image lineage metadata: generated children preserve
parentImageId; table parent resolution/parent labeling improved. - sref propagation: generated children inherit
sreffrom parent/root lineage. - Gallery/Table filters: added Sref-only toggles (
Sref Tagin gallery view controls;Show Sref Onlyin table). - Prompt consistency: unified variation prompt planning between preview/runtime and added image-specific prompt preview query.
- Docs/rules refresh: updated
.cursor/rulesfiles to reflect current architecture, deployment, and stack behavior.