// system_logs
Logs
End-of-day closures and architecture decision records.
0
Sessions
+4 vs prior 7d
0
Shipped
17 this week · +15
0
Decisions
1 this week · -1
0
Streak
best 8d
Tuesday, 9 June 2026
Nest rebuilt ground-up (keep the engine, nuke the data, remove upload): household debt reconciled to £70,412 and Crown flagged as a likely timeshare scam. PropSec's WORKS-COORD-001 milestone also shipped.
What Shipped
Monday, 8 June 2026
Built and properly deployed Nest, a private couples finance dashboard, onto the Mac Mini; the window since the last closure also shipped PropSec's security pressure-test remediation and the Documents module, plus the launchCTRL AIOS command-center.
What Shipped
Friday, 5 June 2026
The AIOS came home. Jarvis was rebuilt owned on the Mac Mini, the audit's disaster-fragility gaps were closed, and two new capabilities landed: Jarvis driving Claude/Opus, and free gym + water reminders.
What Shipped
Thursday, 4 June 2026
PropSec's buildable backlog cleared end to end (the audit-grade evidence pipeline), and Neutron, the AIOS's own autonomous builder, went from idea to a runnable v0.2 in a single session.
What Shipped
Wednesday, 3 June 2026
Program & CapEx, the European tender differentiator, built end to end and shipped to production, alongside the full Wave 0 AI-native ticket sweep.
What Shipped
Friday, 29 May 2026
Heavy single-project day on PropSec ahead of the ~1 Jun demo: shipped the Operations Ledger UI identity, the mobile-web audit fixes, and a full performance sprint, then ran a 9-surface security audit with every confirmed P0/P1 fixed and live, plus bulk property import for citizenM onboarding. Also rebuilt the /shutdown skill and its AIOS integration.
What Shipped
Tuesday, 26 May 2026
Jarvis personal-agent persona shipped to Hermes on the Hostinger VPS (today's primary focus). PropSec follow-up arc across Sessions 80-83 captured in vault after a 14-day closure gap.
What Shipped
Tuesday, 12 May 2026
Mega-day. 21 commits across SaaS + iOS + launchctrl. Morning: invitation-flow rebuild from a 5-layer bug chain. Afternoon: full production-launch milestone (6 sprints + 11-agent audit + 30+ implementation agents), both surfaces shipped to prod. Evening: middleware route-gating fix caught by post-deploy smoke check, then iOS sign-in diagnostic + temp password reset for marksebj@hotmail.co.uk.
What Shipped
Monday, 11 May 2026
PropSec iOS shipped to a real phone for the first time. Four-pass audit cleanup, FM home rebuild driven by council consultation, persona-aware SettingsView, owl AppIcon + Ubuntu Bold wordmark, and the production 500 fixed live.
What Shipped
Saturday, 9 May 2026
Two-day arc closed: yesterday's three module audits (Asset Insights / Tickets / Training) + lint backlog cleared 0/0 + four strategic plan docs filed; today's perf audit Phase 1 14.5/16 items shipped to production. 44 commits on `propsec/main`, deployed on `c9e14e7`.
What Shipped
Friday, 8 May 2026
A 72-commit, +28.7k-LOC PropSec marathon spanning ~18 sessions on `main`. Shipped Asset Insights overhaul Phases 1-4 (AIL schema → walk-the-rooms scoring → manager review → 25-year Lifecycle plan + AIL→MYMP bridge), Tickets Phase 1 + Phase B location pickers, Spaces structured locations, Incidents narrative-first revamp + per-person injury cards, Training Phases A-C risk engine, Planner Tier 1-3 polish, Document version history, Visitors company picker, Operations dashboard. Closed with a 3-agent perf/security/compliance audit + 10 must-fix hardening pass.
What Shipped
Thursday, 7 May 2026
A heavy STOCK-002 follow-up day on top of yesterday's 20-PR sprint. 9 commits on `main` polishing the just-shipped surfaces (UX, perf, correctness) plus a 3-layer smart-document-status system that makes compliance docs verify themselves against expiry dates.
What Shipped
Wednesday, 6 May 2026
STOCK-002 Phase 1 complete: W1 schema and W2 UI/code wiring both shipped to production on `propsec.vercel.app`, on a fully rebuilt propsec-owned stack.
What Shipped
Monday, 4 May 2026
Built and rebuilt PropSec Website V2 end-to-end. Apple cinematic direction → rejected → Snapfix × Expansive hybrid shipped. 22 commits, 11 of 13 modules backed by real propsec-seven captures, full Obsidian write-up landed.
What Shipped
Saturday, 2 May 2026
Rekraft Design hero rebuild shipped to production: full-bleed video, single-image brand wordmark, custom cursors. Closes the splash-threshold direction that opened 1 May. Plus 22 commits of polish backlog from late May 1 (FUSA v3.2 + Rekraft Design case studies) finally fully captured in the vault.
What Shipped
Friday, 1 May 2026
Brand-system overhaul day. FUSA Damascus rebuilt from scratch (Astro v3.0, scroll-scrubbed Higgs Field rotation hero, cook-first copy), new shared rekraft logo deployed across both .agency and .design, and the Rekraft Design Work carousel rebuilt with real hero screenshots and corner brand-mark badges.
What Shipped
Thursday, 30 April 2026
A full day on rekraft.design: animated silk hero, three-retainer pricing rebuild, 2x2 icon grids inside every pricing card, add-on accordion, and a top-to-bottom copy compression on the Practice section.
What Shipped
Monday, 27 April 2026
Big-volume PropSec PPM-001 marathon (38 commits, three-lane executor pivot landed) plus a launchCTRL dispatch architecture rewrite that kills the Vercel cron entirely.
What Shipped
Sunday, 26 April 2026
Lifexl Lightbox stability + performance + scoring rebuild — 9 commits closing every reported issue from the real-world cull session: OOM crash, baby-thumbnail-on-resume, AI score >100, run-to-run inconsistency. Plus Web Worker for resize and a clean working tree.
What Shipped
Saturday, 25 April 2026
Looop knowledge authoring half-shipped: API + article detail page live on disk (KB-001 + KB-003), only the editor modal (KB-002) left to close BACKLOG #3. Design doc + 3 commits.
What Shipped
Friday, 24 April 2026
Looop v0.8 — workshop-response migration shipped, audit-trail wiring closed, Obsidian backlog initialised, and three rounds of "this is more built than the doc says" forced a full code-vs-backlog audit.
What Shipped
Thursday, 23 April 2026
PPM-001 milestone marathon: schema foundations → AI orchestrator → Phase 1–3 execution → UI build-out → hotfixes. 55 commits, +8510/-403 across 48 files on PropSec SaaS — Asset PPM Checklists multi-region library shipped end-to-end today.
What Shipped
Wednesday, 22 April 2026
Retrospective idle-day closure — shutdown was skipped, backfilled on 2026-04-23. No commits and no vault edits captured across the tracked repos; previous day's open loops carried forward.
What Shipped
Tuesday, 21 April 2026
A full 3-dimension audit of looop (security, performance, UI/UX) remediated over seven rounds; 3 DB migrations + 1 one-shot reconciliation applied in production; two brand sites (rekraft.design + LiveLifeCustoms) polished to final register and deployed.
What Shipped
Monday, 20 April 2026
**Rekraft's first paid-client build shipped the same day it was briefed.** TJB Air Conditioning — a 42-year family HVAC firm in Cuxton — went from a warm email with no design brief to a live Workshop Dark website on tjb-air-conditioning.vercel.app, plus a published case study on rekraft.agency/work/tjb-air-conditioning/. Brief was synthesised autonomously (creative-director agent vs Andy-persona agent, tension resolved: Andy's industrial dark-blue wins over the CD's paper-and-copper). Case study v1 was long-form; Mark binned it ("not a single person will read it"); rebuilt visual-first with a browser-chrome mockup + live iframe of the site. Two pattern-level decisions came out of the day and are now in DECISIONS.md.
What Shipped
Saturday, 18 April 2026
**The day cMissionCTRL shipped five milestones (v1.0 → v1.4) and launchctrl rebuilt its dashboard.** Morning: all 7 v1 phases tagged `v1.0-complete`. Afternoon: five-dimension audit → O3 council consult → four-tag v1.1 stack (hot-fix, perf, polish, observability). Data-load afternoon → v1.2 six-wave enrichment (hotels first-class, CapEx overlay, org-aware intel). Finance Q1 landed → v1.3 CapEx rework + UX simplification. Evening first pass: v1.4 visual upgrade (collapsibles, sparklines, burndown, velocity). Evening second pass: Notion Action Items cull (48 archived) mirrored to dashboard via overrides, KPI clarity rewrite on /actions, default scope flipped to Mine. In parallel: launchctrl took 22 commits — Phase 1+2 dashboard widgets, /life route with Apple Health ingest, Activity Hub consolidation, Claude Code stats rebuild, dispatch-logic editorial rewrite.
What Shipped
Friday, 17 April 2026
The Dispatch migration day. Resend domain `dispatch.propsec.co.uk` verified end-to-end (DNS + Vercel env + test send), emails now reaching all three real inboxes instead of gmail-only. launchctrl dispatch optimization pass shipped (parallel sync, priority enrichment restored, Obsidian briefing auto-gen, email polish). Skills infrastructure hardened — gh CLI installed with three accounts, `/shutdown` + `/sync-launchctrl` refactored for capture/restore gh auth instead of hardcoded default.
What Shipped
Thursday, 16 April 2026
looop v0.5 sprint — framework upgrade + performance. Next 14 → 15, React 18 → 19, streaming server-component dashboard, typed Supabase client, Postgres FTS, server actions. Shipped to prod (migrations applied, Vercel deployed via CLI, smoke-tested 200 OK).
What Shipped
Tuesday, 14 April 2026
looop v0.4 sprint — operator platform complete. Super-admin portal, audit log, impersonation, invitations, PostHog telemetry, insight consolidation, profile + onboarding. End-to-end product now self-operable by a solo founder.
What Shipped
Monday, 13 April 2026
Built The Dispatch — launchCTRL's autonomous daily morning briefing — and consolidated the dashboard into a tighter 4-page architecture.
What Shipped
Saturday, 11 April 2026
Fixed a silent priorities-sync bug that had been quietly breaking every LaunchCtrl deploy, and migrated ReKraft Tools onto the Electric Concrete design system.
What Shipped
Thursday, 9 April 2026
Massive LifeXL day — built the Content Dashboard, Photo Editor, two-stage cull pipeline, Naming Agent v4, and upload pipeline overhaul. 30 commits, +2,079 lines across 26 files.
What Shipped
Tuesday, 7 April 2026
Designed and built the `/shutdown` end-of-day system reconciliation skill — from deep research through to first live run.
What Shipped
// decision_log
Program & CapEx is the standout differentiator for the European (Ethos / citizenM) tender, the capability gap versus PACS. It had to be defensible to finance reviewers, AI-native, and multi-currency for a hotel group, built fast over one week.
A 9-surface security swarm (every high finding adversarially re-verified) found the core strong (tenant isolation, parameterised SQL, no XSS) but surfaced real holes. The standout: the public visitor kiosk performed data reads/writes with no server-side PIN check (the PIN only gated the client React screen).
/shutdown took ~15 min, dominated by sequential model tool-calls, and had drifted from /sync-launchctrl (stale step lists, a skip contract with no real trigger, a hardcoded repo list, and idempotency keyed only on the closure note).
Inspired by NetworkChuck's Hermes / Ron Weasley video. Set up a Hermes Agent instance (Nous Research, MIT-licensed, v0.14.0) on a Hostinger VPS to act as an always-on personal Chief of Staff reachable via Telegram. Brain: OpenRouter. Co-drafted the persona in a structured 6-question prompt-design session in Claude Code today.
First device deploy surfaced the question of what the home screen should be for both personas. Tempting unified answer was "lite version of the desktop dashboard with role-specific filters". Council consulted (O3 + Gemini 3.1 Pro) on whether to mirror the desktop dashboard, build a shared rollup, or diverge per persona.
Settings menu was missing from the app. Two routes: mirror the desktop preferences screen (org-level toggles, theme, language) or build a field-app-specific settings surface tuned to the two personas.
22+ Gemini-backed AI endpoints had no rate limiting. Single-user cost-abuse vector per the perf audit. Choice between Upstash Ratelimit (managed Redis) and an in-memory token bucket per Lambda instance.
Analytics page was loading every row of 7 tables (assets, documents, tickets, tasks, training, incidents, vendors) and counting subsets via JS `.filter()`. 10s+ page load on real data; would fall over at 10x scale.
Multiple actions (`completeInspection`, `reorderTemplateItems`, bulk training/tickets, import post) ran per-row sequential UPDATEs. Two routes to fix: parallelize via `Promise.all` (still N round-trips, but concurrent) or fold into a single statement (`CASE WHEN id = ... END` or `inArray + same SET`).
`getProfile()` runs Clerk `auth()` + a DB lookup on every call. Audit showed dashboard page alone calls it 3+ times per request via different server components / actions.
5 upload routes (`incident-attachments`, `documents`, `training-certificates`, `vendor-documents`, `inspection-item-photos`) advertise 50-100MB caps but use `request.formData()` against Vercel's hard 4.5MB Lambda body limit. Files >4.5MB silently fail.
First V2 build was a cinematic Apple-style site (scroll-pinned hero, deep-navy product card, oversized type, restrained palette). Founder reviewed and rejected: "the apple vibe is completely wrong for propsec".
Shipped the V2 home page with "Aligned with SFG20", "UK data residency", "UK Maintenance Manager", and "GoCardless for UK businesses" framing. Founder caught it: "you wouldn't have framed it as a UK only product. I don't want these mistakes to be repeated again."
All four of Mark's test iPhones showed the rekraft.design hero video frozen on the poster, the marquee static, and scroll-triggered animations dead. Diagnosis chain went from "iOS autoplay quirk" to "Lenis breaking touch" to the actual root cause: a single global CSS rule was killing every animation and transition site-wide to 0.001ms whenever the user had Reduce Motion enabled in iOS Settings, Accessibility (or had Low Power Mode on, which implicitly triggers the same media query).
v2.1 of Fusa Kitchen (Next.js + GSAP cinematic hero) felt "too tech-startup, not chef-knife brand." Mark cited oryzo.ai as the new visual reference (Astro-based, premium-minimal, scroll-driven).
FUSA hero centerpiece needed a long-axis rotation of the Kiritsuke knife. Three Seedance 2.0 generations on Higgs Field failed (in-screen-plane spin, then a camera tilt with no rotation, then a vertical-plane orbit that didn't match the mental model of a horizontal roll).
FUSA needed a 360° rotation video and a custom carrot cursor. Both could have been commissioned externally or hand-built (3D model in Blender, hand-rolled SVG).
The Dispatch email (daily morning brief) ran via Vercel Cron at 08:00 UTC, reading a pre-distilled `dispatch-brief.json` written by `/shutdown` the previous evening. Two pain points: (1) on days `/shutdown` wasn't run, the email shipped stale data with an amber banner, which Mark didn't want; (2) recipient list still included a personal Gmail (`marksebj.ypr@gmail.com`) that should never have been there.
PPM-001 originally treated all maintenance work as a single flow with an "assignee" field. As Phase 3 came together it became clear that in-house engineers, contracted vendors, and external specialists need different gating, different audit trails, and different cascade rules. Collapsing them was forcing branching everywhere downstream.
Apr 6 design doc proposed an in-browser RAW-to-JPEG converter at `/admin/convert` using the `libraw` wasm library (1.4MB, lived at `public/libraw/`). Idea was to give users a way to convert RAFs locally without Lightroom.
v2.1 scoring schema had Gemini rate ~13 fine-grained sub-dimensions (`technical.sharpness`, `composition.framing`, `aesthetic.color_harmony`, etc.) AND emit its own `overall_score` (0-100) computed from a 5-dimension weighted rubric the schema didn't capture. Gemini was doing arithmetic in a black box on dimensions it never explicitly rated. Same photo scored 72 vs 81 across runs because the rollup was vibes. Mark also reported a >100 score (460/100) — turned out to be a `× 10` math bug in the prompt formula.
Tier 1 import called `createImageBitmap` + `OffscreenCanvas.drawImage` + `convertToBlob` twice per photo (300px thumbnail + 1024px AI preview). All three are async wrappers but the actual decode + canvas resampling runs on the main thread, so a 188-photo cull would freeze the UI for a perceptible fraction of every iteration. At 1700+ photos the freezes stack into visible jank.
Detail overlay (`PhotoDetailOverlay.tsx`) and editor (`EditorScreen.tsx`) were calling `getJpegFromFile(await sourceFile.arrayBuffer())` per navigation, which materialised the full 40-60MB RAF in memory each time. Rapid arrow-key navigation through 50+ photos accumulated allocations + Blob-URL leaks until Chrome killed the renderer with the "page couldn't load" recovery UI. Tier 1 import already used the right primitive (`extractJpegFromFile(file)` slices ~5MB) but the detail/edit paths never got migrated.
A planning pass flagged that `resizeJpeg` in `thumbnails.ts` could be 20-40% faster by passing `{ resizeWidth, resizeHeight, resizeQuality: 'high' }` to `createImageBitmap`, skipping the OffscreenCanvas `drawImage` resampling step. Browser native resize during decode is genuinely faster than canvas resize.
Resume restored photos from IndexedDB but left `sourceFilesRef` empty, so the detail view fell back to the persisted 300px thumbnail ("baby thumbnail" UX) and Export had no source files to write. The directory-handle helpers in `db.ts` (`saveDirectoryHandle`, `getStoredDirectoryHandle`, `requestDirectoryPermission`) existed but were never called.
PPM-001 needs to generate four linked PPM templates per `(asset_type, country_code)` — annual, quarterly, monthly, weekly — that cite the right legislation and stay internally consistent (weekly items shouldn't contradict the annual master). Council-reviewed three architectures: single prompt emits all four; two calls (annual master → cascade); four independent calls.
AI-generated PPM templates cite legislation and SFG20 task codes. Risk: Gemini hallucinates a regulation or cites a repealed one; ops team runs a compliance-critical inspection against a bogus reference. Original plan was a Perplexity verification pass over every generated template before it lands in the library.
How are PPM templates scoped — per-asset (one template generation per asset, full de-duplication burden), per-asset-type (shared across orgs, no org customisation), or org-level? The per-asset model means 500 identical boilers in a hotel group each get their own generated + stored template and any regulation change means 500 updates.
A gas boiler in the UK and a gas boiler in Italy share ~70% of the inspection checklist (physical checks, flue, pressure vessel), but differ on the regulatory citations and 20–30% of items (UK: Gas Safety (Installation and Use) Regs 1998; Italy: UNI 10738). Modelled as a single template with a `country_applicability` array, or as cloned templates with a shared `base_template_id`?
Asset detail page previously had one long scroll with mixed content (overview, technical specs, history, notes). Adding PPM adds more — templates list, generate/regenerate CTAs, inspection history, overdue alerts. Risk: critical compliance info ("this asset's annual inspection is 90 days overdue") gets buried in the scroll.
Migration 021 introduced `rename_submission_prefix(uuid, text)` — a single SQL statement that replaces N per-row UPDATE round-trips when an admin changes a loop's submission prefix. Shipped the route rewrite first and discovered in production that the prefix rename silently half-succeeded: `loops.submission_prefix` UPDATE committed first, then the RPC call 500'd because migration 021 hadn't been pushed to the linked Supabase project yet, and the route returned 500 but the loops row was already changed. Result: settings showed `LTL`, submissions still showed `CIT-*`.
Audit flagged that the `submission-photos` Supabase Storage bucket was `public=true`. Supabase serves public buckets via a CDN path that bypasses `storage.objects` RLS entirely — so anyone who could guess or enumerate a path (loop slug + year-month + per-loop submission counter are all predictable) could read any hotel damage photo without authentication. An earlier migration tightened the RLS read policy but left the bucket public, which is cosmetic because RLS doesn't apply to the CDN path.
Audit found 46 of 66 authenticated API routes missing `export const dynamic = 'force-dynamic'`. Today, Next's `cookies()` call inside `requireAuth` keeps these routes dynamic by side effect — but any refactor that moves auth into a wrapper or removes the cookie read could silently allow the Edge to cache a response and serve it to a different user. Cache poisoning with the current user's data.
Through-iteration pass on the rekraft.design brand. Structural accent went lime → forest green (rejected as "pastoral") → deep ink blue `#1E2E4A` (approved, "classic Parisian library register"). Italic emphasis colour separately tuned to cherry burgundy `#8B1E2A`. Mark also requested em dashes be stripped sitewide — "I hate dashes." Restructured body copy to use shorter sentences instead of parenthetical dashes; replaced `—` in eyebrows with middle dots (`04 · About`).
Rebuilt the About section three times today. First around property/FM background (too narrow, abandoned). Then around creative/maker identity — experimented with a portrait-on-circle editorial hero (inspired by 21st.dev MinimalistHero). Mark rejected on the cream theme; reverted to 2-col layout. First rewrite of the 2-col copy leaned too self-deprecating ("hobby grows up", "late-night logos in college") — stripped for credibility register.
Initial portfolio landed with 14 cases including LousVitton Monogram (featured), Mon3ymotivated, Dare2Dream, Chef Apparel, plus stock Unsplash imagery throughout. Review surfaced: (a) LousVitton is a legally shaky featured piece, (b) Mon3ymotivated/Dare2Dream/Chef are too weak to earn a card, (c) Unsplash reads as a "demo site" when the LLC archive has years of real product photography and artwork.
Migration 016 introduced per-loop submission prefixes (AMS-0001, TWR-0001, etc.) to disambiguate codes across properties. Original design deliberately kept historical submissions on their old prefix when the admin changed it, on the theory that external references (emails, chats mentioning LQ-0042) shouldn't break. User testing showed the opposite intuition: changing the prefix in settings and then seeing CIT-0001/CIT-0002 still in the submissions list felt broken, not considerate. The mental model is "rename the loop's codes", not "from-now-on use a new prefix".
Chrome DevTools flagged multi-second INP blocks (1.1s, then 12.4s) on `main.animate-fade-in` elements in the loop layout, org layout, and admin layout. The flagged element was the outer wrapper that contains a tree of streaming Suspense boundaries (dashboard stat cards, trend sections, supplier health grid, etc.). Each time a Suspense boundary resolved during the CSS opacity animation, React reconciled inside a subtree whose compositing was mid-flight, producing paint thrash that the browser measured as blocked UI.
The browser Supabase client crashed production with "Missing NEXT_PUBLIC_SUPABASE_URL environment variable" once a client component (AIInsightListener for realtime toasts) started using it. The helper read `process.env[key]` dynamically; Next.js's build-time replacer only inlines `NEXT_PUBLIC_*` values when referenced via literal property access (`process.env.NEXT_PUBLIC_SUPABASE_URL`). Dynamic index access isn't recognised, so the value stays as a runtime `process.env` lookup — which in the browser is `{}`.
TJB Air Conditioning (Rekraft's first paid client site) needed a live URL to show the client and to publish as a portfolio case study, but the real domain (tjbairconditioning.co.uk) DNS hasn't been cut over yet. DNS moves are out of Mark's control — sit with the client's existing hosting/registrar setup and depend on whoever owns that relationship to action the swap.
Rekraft's `/work/` page was a "coming soon" placeholder, and the agency site needed real case studies to convert future prospects. Meanwhile, every client deliverable already produces shippable website content. First draft of a long-form written case study was produced today and Mark's reaction was that no one reads them — the conversion surface has to respect that reality.
/actions landing page showed 1,691 open actions across everyone. Mark's reaction: "i only want my open actions, not anyone else. 300 is outraguous". The default scope was "everyone" even though the dashboard is single-user.
Ran a 48-item cleanup on Notion cM Action Items DB (LOL living room, hotel-level interior, Smartsheet admin, scheduling admin, third-party-owned, low-level follow-ups — all below Head of HPM EU level). Notion DB and dashboard bundle both extract from the same meeting summaries but via separate pipelines with different granularities — items don't match 1:1.
v1.1 Optimization needed to take the dashboard from "force-dynamic on every route" to something that actually uses the edge cache. Options: (A) custom in-process cache keyed by slug (what v1.0 had — lost on every Vercel cold start); (B) `React.cache()` wrapper for per-request dedup; (C) `unstable_cache` from `next/cache` with tags + revalidate; (D) the Next 16 `cacheComponents` flag + `'use cache'` directive. O3 explicitly specified option C with `revalidateTag('vault', 'max')` on mutation in the post-ship advisory.
The perf audit flagged Recharts (~100KB) and Cytoscape (~300KB) as Perf-P1 for code-splitting via `next/dynamic(ssr:false)`. Once the unstable_cache win landed, this was the next-largest theoretical perf lever. Options: (A) ship dynamic imports for both; (B) ship for Cytoscape only; (C) defer both with a documented rationale.
Phase 7 original spec was dashboard checkbox → Notion MCP `notion-update-page` → update source meeting page → re-sync picks up. Upon inspection: (1) Tactiq-generated meeting summaries bury action items inside free-text sections with no stable anchor (no block ID, no structured list we can target); (2) Haiku 4.5 extraction isn't byte-stable — re-running against the same page yields semantically-equivalent but textually-different action descriptions; (3) no separate Actions database exists in Notion that could hold canonical state. Writing status back into source pages would therefore either corrupt the transcript or silently detach from it after the next re-extraction. Three options considered: (A) ship write-back anyway (accept corruption + detachment risk); (B) build a parallel Actions DB in Notion first, then write-back to that; (C) pivot to a dashboard-first override layer that doesn't touch Notion at all.
Starting a new personal work intelligence dashboard for the Another Star / citizenM day job. Input corpus is a Notion database of 360 Tactiq-generated meeting summaries (transcripts + AI summaries) growing weekly. Desired insights: topic drift month-to-month, recurring issues (resolved vs. lingering), most-discussed projects/properties/vendors, cross-meeting action items, people-graph, decisions log, "hot right now" spikes. The killer feature identified in the O3 council consult: **Pre-Meeting Auto-Briefs** that generate a one-pager 60 min before every call.
`/life` needed an automated way to refresh Apple Health vitals (steps, HR, HRV, sleep, workouts, etc.) — the manual flow was tap "Export" in Health Auto Export → JSON lands in iCloud → `sync-apple-health.mjs` reads it next time `/sync-launchctrl` runs. Three options for automating the phone-side trigger: (A) HAE's "iCloud Drive" automation type → writes per-metric per-day files into nested `AutoSync/HealthMetrics/<metric>/<date>.hae` folders; (B) HAE's "REST API" automation type → POSTs unified `{ data: { metrics, workouts }}` JSON payload to a URL of our choosing; (C) keep manual flow + iOS Shortcut to automate the tap.
Both skills previously ended with `gh auth switch --user propsec` on the assumption that PropSec work was the default context after every shutdown. Flagged as wrong — the "correct next account" depends on what you're doing next, not what the skill assumes. Three options considered: (A) remove the switch-back line entirely and let SSH keys handle auth, (B) capture the active account at skill entry and restore at exit, (C) leave as-is and flip default to `marksebj`.
Resend's free tier + default `onboarding@resend.dev` sender could only deliver to one recipient (`marksebj.ypr@gmail.com`), blocking the real targets `marksebj@hotmail.co.uk` and `Mark.jacob@anotherstar.com`. Three options: (A) subdomain of an existing owned domain — `dispatch.propsec.co.uk` or `dispatch.founded.ceo`; (B) buy a fresh personal domain for clean separation (~$12/yr); (C) root domain of an owned TLD.
looop was on Next 14.2.35 + React 18. Next 15 unlocks streaming with Suspense as the default pattern, Server Actions as first-class, `after()` replacing ad-hoc `waitUntil`, and a cleaner async request API (`params`, `cookies()`). PPR and the `'use cache'` directive are further wins but require `next@canary`. Question was whether to do a full canary upgrade to get everything, or stage it.
`next-pwa` was installed but only half-wired. It registered a Workbox service worker; separately the app had a `useOfflineQueue` hook storing pending submissions in IndexedDB with manual replay on reconnect. The two never talked. `next-pwa` also has open compatibility issues with Next 15 App Router. Three options: (A) drop `next-pwa`, keep IndexedDB; (B) fully wire `next-pwa` Background Sync to `useOfflineQueue`; (C) switch to a maintained fork like `@ducanh2912/next-pwa` or `@serwist/next`.
Every `.from('submissions')` call was untyped. Returned `any` / required `as X` casts. `select('*')` was used in 30+ places. Ideal solution is `supabase gen types typescript` from the live DB, but that requires CLI linking which hadn't been done. Options: (A) require `supabase link` before touching anything; (B) hand-write the `Database` type from migrations; (C) ignore typing entirely.
Submissions, insights, knowledge browse used OR'd `ilike '%term%'` scans across 3-4 columns. Not indexed, not ranked, no stemming. Typeahead for products/suppliers already used pg_trgm + GIN indexes from migration 003. Decision was whether to convert everything to FTS or just the keyword-search surfaces.
launchCTRL needed an autonomous daily morning briefing — a "mission control" email summarizing system status, priorities, activity, and open loops. Had to choose between external scheduler (e.g., GitHub Actions, cron service) vs. Vercel-native, and email provider (SendGrid, SES, Resend).
launchCTRL had separate `/priorities` and `/ideas` pages. The nav had 5 links which felt cluttered for a personal dashboard. Ideas and priorities are conceptually related — both are "what to work on next."
Closures (daily shutdown notes) and Decisions (ADR log) were on separate pages. Both are chronological logs that Mark reviews occasionally. Having two separate log pages diluted the nav.
Noticed the live `/priorities` page on launchctrl-eta.vercel.app was consistently stale after deploys. Root cause: `scripts/sync-priorities.mjs` had `VAULT_PATH` hardcoded to `/Users/markjacob/...` (wrong username — should be `marksebj`). The script ran on every deploy, silently regenerated `priorities.json` with zero items, and no one noticed because the deploy still succeeded.
Lightbox was auto-uploading all kept photos to portfolio AND auto-creating Instagram content queue items. Mark wanted separation: cull from shoot is different from cull for Instagram.
Photo Editor heal tool originally used OpenCV.js WASM (~10MB) for cv.inpaint(). It loaded slowly, froze the UI, and often failed silently.
Designing the `/shutdown` skill — choosing between conversational prompts vs auto-generated summary
Deciding where daily closure notes should live in the Obsidian vault
RecipeCam build plan — deciding target platforms
Choosing the camera app tech stack
Needed a way to consult multiple AI models (Gemini, GPT, Codex, DeepSeek) from within Claude Code
Needed persistent context that survives across all Claude Code sessions
Planning the Life Dashboard iOS app
Building launchCTRL portfolio dashboard
PropSec SaaS and Scaler both need PostgreSQL
Both need auth, database, storage, and real-time
Watched Liam Ottley's AIOS video, recognized PropSec already has the data model for it
Multiple projects all need consistent UI