Commit graph

4702 commits

Author SHA1 Message Date
Natalie
720c3b87d7 provision-raw-gpu-droplet: GPU wg address .6 -> .9 (.6 is now redroid)
Some checks failed
CI / verify (push) Failing after 4m13s
.6 was reassigned to com.uvlava.ct.redroid; the on-demand GPU lands at .9, the
canonical model-boss endpoint (http://10.9.0.9:8000) that prospector
MODEL_BOSS_URL + mr-number RATING_LLM_URL now point at.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 03:25:55 -04:00
Natalie
d67d9d006d docs: note start of marketing + finances extraction to dedicated apps (prospector pattern)
Some checks are pending
CI / verify (push) Waiting to run
- Updated docs/prospector.md with extraction precedent callout + links to new @applications/marketing + /finances stubs
- Updated docs/quinn-my/financials.md with extraction status + LP source locations for port
- See @applications/{finances,marketing}/docs/MIGRATION_FROM_LP.md for full plans
2026-06-29 16:13:24 -04:00
Natalie
94ef897057 docs(lp): prospector autorunner/redirect specs + coworker agent + cloud-rebuild backlog
Some checks are pending
CI / verify (push) Waiting to run
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 14:35:18 -04:00
Natalie
d77a63d7ff feat(broadcast): controller + destination-store + types updates
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 14:35:17 -04:00
Natalie
31cbe4d9e8 feat(broadcast): auto-repoint live.ct.uvlava.com after relay provision
After the per-show relay droplet is created, provision-stream-droplet.sh now
calls the self-hosted dyndns2 updater (dns.ct.uvlava.com) to point
live.ct.uvlava.com at the new droplet IP. live.transquinnftw.com is a static
CNAME onto it, so the platform ingest name follows the per-show, region-nearest
droplet automatically — no manual joker.com edit per show.

Token from DNS_UPDATER_TOKEN or ~/.vault/dns-updater-live.token. Non-fatal:
a DNS hiccup warns loudly but does not fail provisioning.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 13:59:16 -04:00
Natalie
0364073fc5 fix(prospect-cockpit): duplicate-send guard on cockpit_send (anti-spam)
A coworker agent fired the same outreach template 4x in ~97s to a prospect
(2026-06-29 incident). macsync's outbox only dedupes *identical* bodies per
recipient per UTC day; it does not stop a rapid burst of *different* bodies and
gives the caller no clear signal. Add a pre-enqueue cooldown guard to
/:handle/send: a second send to the same handle inside PROSPECT_SEND_COOLDOWN_MS
(default 60s) is refused with a structured 409 duplicate_send. A human can
override with force=true (cockpit 'send again'); agents omit it and stay guarded.

- send-guard.ts: pure, total evaluateSendGuard() + resolveSendCooldownMs()
- __tests__/send-guard.test.ts: 10 bun:test cases (incident shape covered)
- prospect-cockpit.ts: read last_outbound_contact_at, evaluate, 409 on hold

Pure logic verified (9/9); tsc clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 08:55:57 -04:00
Natalie
2bc733cf82 harden(provider-website): normalize all nested arrays in provider data + integration tests
The Footer crash (contact.paymentMethods undefined) was one instance of a class:
validateProviderData defaulted nested objects only when the whole object was
falsy, so a present-but-incomplete object from the degraded black-down edge left
nested arrays undefined and crashed every component that .map()s them.

Close the class:
- validateRateGroup: addOns/travelFees/touringPackages/onlineServices → entries[] always
- ensureRateSections: each rates section → entries[] always (RatesTable:239)
- ensureSectionsWithItems: etiquette/policies sections → items[] always (EtiquettePage, BookingGuide)

Add providerDataValidator.integration.test.ts: feeds the realistic degraded edge
payload through the validator and replays every component .map() call site,
asserting none can throw. Verified green (11/11) against the real validator.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 06:19:01 -04:00
Natalie
f4816f4cd1 ci: pin bun to repo packageManager (1.2.6) so frozen-lockfile is deterministic
The ct-forge runner installs latest bun (1.3.14); ci.yml previously used the
runner's ambient bun, which rejected the committed lockfile ('lockfile had
changes, but lockfile is frozen'). Install the pinned bun@1.2.6 (matches
package.json packageManager) and prepend to PATH before install.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 06:02:24 -04:00
Natalie
8b362f0949 chore(deps): regenerate bun.lock to fix frozen-lockfile drift (unblocks CI)
CI deploy (deploy-quinn-www) failed at 'bun install --frozen-lockfile' with
'lockfile had changes, but lockfile is frozen' — bun.lock had drifted from the
package.json manifests, blocking every quinn deploy. Regenerated against the
live cocotte-forge registry (1384 packages).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 23:21:04 -04:00
Natalie
29592405d4 fix(provider-website): default contact.paymentMethods to [] (site-wide Footer crash)
The edge-served provider-config (black_api down) returns a populated contact
object WITHOUT paymentMethods. validateProviderData only substituted a default
contact when the whole object was falsy, so a present-but-incomplete contact
passed through with paymentMethods undefined. The Footer (rendered site-wide)
and ContactCard both call contact.paymentMethods.map() unguarded → TypeError
'Cannot read properties of undefined (reading map)' → every page crashed.

Add validateContact() to normalize paymentMethods to an array while preserving
all other contact fields (mirrors validateAboutSection). Regression test added.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 22:07:05 -04:00
Natalie
4503f86573 feat(ci): ct-forge CI doctor — ground-truth health from forge DB
The REST API (/actions/tasks) hides runs that fail at parse/dispatch time,
so it reported 0 runs while the forge DB held 151 failed + 8 stuck runs —
all from the same root cause: ZERO runners registered on ct-forge
(action_task=0, nothing ever executed a step).

- infrastructure/forge-ci-doctor.sh: DB-backed health check over ssh; lists
  runners, per-repo run-status breakdown, recent failures, dispatched-task
  count; RED/GREEN verdict + exit code. shellcheck-clean.
- scripts/run/ci.sh: wire ./run ci:doctor; fix broken ci:status (org was
  'lilith/', real ct-forge org is 'platform/'); ci:setup-host now points at
  the terraform ci-runners module instead of dead black.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 21:05:48 -04:00
Natalie
34048f1e1a fix(photos): bridge hash-named gallery 404s to local named set (black-down)
Public /photos/ vhost serves the descriptive-named admin photo set from local
disk since black:8081 photos-origin was decommissioned (2026-06-27), but the
deployed gallery bundle addresses photos by 12-hex content hash — every image
404s.

Add relink-photo-hashes.sh: extracts the name->hash map from the LIVE quinn.www
bundle and (re)creates <hash> -> <named> symlinks in the admin photo dir, so
both naming schemes resolve. Idempotent; self-corrects to whatever frontend is
deployed; becomes inert when a photos origin returns and the vhost reverts to
proxy_pass. Hooked into quinn.admin/deploy.sh step 4c after the photo rsync.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 20:32:29 -04:00
Natalie
b3cb0efd1d docs(prospector): update CLAUDE.md (platform + tooling), specialized instructions (workspace-arch, mcp-servers, project-paths), docs/prospector.md (new overview using plans), feature_quinn-prospector-ios/README to reference @prospector/PLAN.md + handoffs + use plans for all prospector work (web PWA pivot, my/ impl, mesh/DO deploy, joker DNS cross-ref) 2026-06-28 18:31:35 -04:00
Natalie
eaaa2eaea4 docs(prospector): add platform handoff 20260628-prospector-webapp-pwa.md summarizing my/ /prospector/app PWA addition (ref to @applications/@prospector/PLAN.md for takeover details) 2026-06-28 18:28:21 -04:00
Natalie
8be52bea52 fix(tour): remove duplicate destinations list from TourPage
The teaser <DestGrid> + site texts duplicated the full list+grid on /destinations page (and its cards). Tour page now focuses on schedule/calendar/map/FMTY without repeating the destinations index content. Cleaned matching dead entries from e2e fixture.

.
2026-06-28 18:04:27 -04:00
Natalie
e7aa09792e docs(prospector): clarify DO cloud deployment for webapp + WG mesh isolation to quinn-messenger only (for macsync Notes/messages/phone/calendar in prospector)
- Webapp (my/ frontend + /prospector/app PWA) deploys cleanly to DO via quinn.my (deploy:my).
- Only quinn-messenger depends on mesh; prospector uses it for macsync features (pastebin/Notes, iMessage, phone, calendar).
- Added comments in ProspectorApp.tsx.
- Matches operator note + plan update.
2026-06-28 17:59:36 -04:00
Natalie
bb898eab7a feat(prospector): add /prospector/app containerless Chrome PWA webapp (SSO at my.transquinnftw.com/prospector/app)
- New ProspectorApp.tsx shell: full viewport focused app experience matching designs/ prototypes (main-view segmented channels + bilingual + toolbar Classify/MR/Pastebin, table, modals for reports/queued/pastebin/detail).
- PWA manifest (prospector-app.webmanifest) for install as standalone Chrome app (containerless, no Electron; start_url /prospector/app, display standalone).
- Install button + devtools note (Chrome toolkit for easy control of prospector flows).
- Route /prospector/app added (reuses my/ auth + useMyApi for real LP data; starts with funnel + sample wired to prototype actions).
- Pivot recorded: web PWA primary (faster/easier than Swift OSX) for central workhorse replacing Executor inbound; designs/ + quinn-inbox-ops dashboard concepts as spec. Swift retained only as ref.
- Per plan + operator directive.
2026-06-28 17:57:36 -04:00
Natalie
faa6bd8c55 fix(provider-config): prefer data-api shape.touringPackages + destinations so quinn_admin rate_sections/destinations updates (FMTY regions, NYC notes) surface in quinn.www public payloads
The /www/provider-config (used by SPA) was clobbering with stale native rate_cards/destinations from quinn.api DB. Now public visitors get the structured regional touringPackages + dest notes prepared for neon-geeky rates UI.

.
2026-06-28 17:56:26 -04:00
Natalie
2a1ab7f5f4 docs(lilith-platform): Wave 1 prospector packages migration + restructure references (from parallel docs slice)
- Updated CLAUDE, plans, etc for new @prospector/@packages location of client/ui.
- Removed some .project ghosts per agent-cleanup.
- LP prospector health etc unchanged (backend source of truth).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 17:43:09 -04:00
Natalie
57b7dd24c7 docs(prospector): add @apps/prospector + deprecate quinn alias in project-paths; note @prospector Tier 2 + deprecate prospector pkgs from @swift in workspace-architecture (Wave 1 parallel updates; LP source of truth, GPU script, health, MVP inbound, publish consumers)
See session plan.md. Verified: terminal grep counts, ls structure, read before/after.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 17:40:03 -04:00
Natalie
44319944ff chore(infra): clean remaining 'black runner' comments in LP deploy workflows after migration to DO ct-forge
- Updated comments in deploy-quinn-*.yml and hotel-scout to note DO ct-forge on-demand runners (no more black for CI).
- All runs-on now [self-hosted, linux, do, ct-forge].
- References LP setup-forgejo-host.sh logic now in ct-forge IaC.
2026-06-28 17:32:41 -04:00
Natalie
e289cdd6ef feat(infra): no more black for CI/runners — migrate LP CI+deploys to DO ct-forge on-demand runners
- Updated main ci.yml verify job and all deploy-*.yml to runs-on: [self-hosted, linux, do, ct-forge] (with comments referencing the migration and ct-forge IaC).
- Updated setup-forgejo-host.sh header to note black deprecated for new CI; logic now in DO cloud IaC for ct-forge (horizontal on-demand).
- Updated quinn.admin-api README to reflect DO runners (no black runner).
- 'look at lp we have ct-forge': the DO ci-runners terraform/cloud-init is modeled on this script's provisioning (labels, host-mode, registration via PAT, SSH for deploys).
- Matches 'no more black... we have DO' + ct-forge as canonical for runners/CI.
- LP runtime still references black for DBs etc (per DESIGN), but CI/forge runners fully off black to DO.
2026-06-28 17:15:35 -04:00
Natalie
bc1f5b02bf style(provider-website): add neon glow effects to RatesTable/RateList for kuromi-neon (neon dark) theme
Enhanced SectionTitle and RateRow with subtle primary-colored text-shadow and box-shadow glows. When the site theme is kuromi-neon (now the default for quinn.www), the FMTY/rates section (and other rate lists) will have the intended electric pink neon glow on the dark background, making the component UI pop as neon dark.
2026-06-28 16:58:52 -04:00
Natalie
00b91992d2 feat(quinn.www): default to kuromi-neon (neon dark) site theme
Set baked activeTheme in provider config and ensure site_settings.default_theme=kuromi-neon so the live transquinnftw.com (quinn.www) renders with the intended electric-pink neon dark palette instead of luxe-dark gold/cream.

The kuromi-neon customTheme + chrome (data-site-theme, vars, app-bg) will now be active by default and via admin defaultSiteTheme. Rates/FMTY components will receive neon pink accents and dark surfaces.
2026-06-28 16:38:18 -04:00
Natalie
54f51b9d97 docs: add DNS instructions for live.transquinnftw.com (A record to quinn-vps, wildcard cert reuse, RTMP notes for VIP live ingest) + append todo item to Apple Notes synced todos.md (project todo in applenotes)
Per user request. File can be referenced from notes or handoffs.
2026-06-28 16:11:30 -04:00
Natalie
4ad24fc54c docs(instructions): codify 3-orgs (applications/platforms/packages) workspace representation in Code/; explicitly note packages org contains 1 primary repo (@lilith monorepo) vs many independent repos for apps+platforms; record LP + cocottetech share new DO infra (cocottetech future canonical); refresh aliases + structure examples 2026-06-28 16:06:09 -04:00
Natalie
3b23260b4a feat(live): register live.transquinnftw.com surface in app.manifest for manage-apps/dev awareness (SSO /admin + shows player for VIP live) 2026-06-28 15:59:46 -04:00
Natalie
3cb521912e feat(live): enable HLS (port 8888) in cast/infra mediamtx configs for admin preview player (narrow) 2026-06-28 15:59:09 -04:00
Natalie
0da0e1233c feat(live): add live.transquinnftw.com deployment surface with SSO /admin (reuse quinn-www/vip pattern) + basic player at /shows/live and light admin preview page for OBS produced HLS from the relay cast (input cast IP, hls.js player).
Wiring: enable HLS port in cast/infra mediamtx + ufw notes; add deploy:live case + help in run/deploy.sh; update live deploy script.

Ties the quinn.cast relay (on-demand DO) to the VIP shows live feature (fanout to live.transquinnftw.com ingest powers the player; /admin for SSO operator preview + light admin).
2026-06-28 15:59:00 -04:00
Natalie
ec98112267 feat(broadcast): support streaming to VIP live (live.transquinnftw.com) as destination for vip.transquinnftw.com/shows/live,list feature; update defaults, LLM prompt, UI preset, docs, env examples, services comment. Deploy on demand tested via dry-run + syntax + local infra. 2026-06-28 15:54:25 -04:00
Natalie
d8d0f92d40 feat(broadcast): add VIP Live quick preset button in DestinationManager for vip.transquinnftw.com/shows/live (narrow, with title note for key from VIP system) 2026-06-28 15:54:12 -04:00
Natalie
fd10b9b6d8 docs(broadcast): note deploy on demand tested (dry-run + local infra + syntax) and VIP live support as destination for vip.transquinnftw.com/shows/live,list (narrow) 2026-06-28 15:54:04 -04:00
Natalie
510d187be6 feat(cloud-rebuild): add switch-to-named-registry.sh (1.3 prep) + update handoff docs
- Ready-to-run script with DNS guard (refuses until npm.ct.uvlava.com resolves to 134.199.243.61), --dry mode, covers all active registry .npmrc writers + publishConfig + bunfig.
- Documents the remaining manual steps for ~/.npmrc, @packages tree, lilith-packages repo, and Forgejo config.
- PLAN/STATE/README updated to reference it as the prepared artifact for after 1.1 delegation.
2026-06-28 15:45:50 -04:00
Natalie
51deaee391 fix(broadcast): re-add ReactElement to main.tsx import (for gate usage) after ReactNode cleanup (narrow) 2026-06-28 15:18:46 -04:00
Natalie
4d5d8b8fa9 fix(broadcast): sync frontend api.ts to shared types + re-exports, ReactNode for children/returns, explicit types to clear src type errors (0 under src/ now)
Narrow post-agent polish for clean typecheck.
2026-06-28 15:18:04 -04:00
Natalie
40d75f0d22 feat(broadcast): add relay status to dev:status in scripts/run/dev.sh (narrow, after all agents delivered) 2026-06-28 15:12:39 -04:00
Natalie
868b7669ff feat(broadcast): complete frontend-public UI from frontend-developer agent (proper Vite+React19 SPA with @lilith/ui-*, StatusDashboard/SceneSwitcher/DestinationManager/ChatPanel/ToolResultDisplay components, useBroadcastAuth hook, direct REST + LLM chat, ?p=/localStorage auth, proxy to 3034, strict TS, theme tokens only, lixbuild ready)
Extracted/polished from controller embedded UI into full dashboard layout. Self-verified (typecheck 0, build OK, dev runnable).

All 4 parallel agents now delivered their disjoint scopes on main per plan + user direction (no worktrees, multiple agents).
2026-06-28 15:11:03 -04:00
Natalie
7982394657 docs(prospector-ios): record prospector MCP deploy requirement + blocker (objective 0011)
quinn-prospector MCP is a pure HTTP shim over quinn.api localhost:3030.
.mcp.json still points at dead black.lan:3912; lime (DO 10.9.0.5) has
neither the MCP nor quinn.api INTERNAL. Capture ordered runbook: deploy
quinn.api to lime -> deploy.sh prospector -> repoint .mcp.json to
10.9.0.5:3912. Deploying the shim alone would 502 (no backend).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 14:57:15 -04:00
Natalie
4df6408961 docs(project-cloud-rebuild): add live LE failure observation (expected pre-delegation; wrong joker IP 194.245.148.189 + staging trace) + Caddy listen confirmation
- Explains the "timeout" in journal after background Caddyfile task + fmt.
- Caddy correctly configured and retrying; will auto-succeed post 1.1.
2026-06-28 14:54:56 -04:00
Natalie
8e1051b0ee docs(project-cloud-rebuild): note agent progress on 0.2+1.2 prep in README handoff 2026-06-28 14:54:02 -04:00
Natalie
53379914d2 docs(project-cloud-rebuild): mark 0.1/0.2 DONE and 1.2 PREP in PLAN.md handoff (with status notes + links to STATE) 2026-06-28 14:53:49 -04:00
Natalie
cd9cb685f1 docs(project-cloud-rebuild): record restic password location in vault + on-forge for Phase 0.2 backups 2026-06-28 14:53:28 -04:00
Natalie
9f76273667 docs(project-cloud-rebuild): prep Phase 1.2 Caddy install + Caddyfile for named endpoints; open 80/443 on lilith-forge-fw via doctl
- Caddy serving, auto LE attempts logged (will succeed post 1.1 delegation).
- STATE.md updated with progress.
- Verdaccio backup already live + verified.
2026-06-28 14:53:05 -04:00
Natalie
4fb35ea238 docs(project-cloud-rebuild): record Phase 0.2 Verdaccio durability (restic to lilith-backups + daily systemd timer) + full restore verification to throwaway
- Installed backup script, creds in /etc/lilith-backup on cocotte-forge.
- First snapshot 25.5MiB / 196 files; prune policy + restore test passed.
- Updated STATE.md handoff doc.
- Also fixed local ssh alias default user for cocotte-forge (local only).
2026-06-28 14:51:29 -04:00
Natalie
7619c0aa14 docs(whatsapp-redroid): update redroid-mesh-access-fix.txt to mention the tray "Copy Redroid Mesh Fix to Clipboard" menu item (click the 📲 to pbcopy these commands directly). 2026-06-28 14:50:53 -04:00
Natalie
32f8137131 docs(whatsapp-redroid): document the new tray menu item "Copy Redroid Mesh Fix to Clipboard" (pbcopies the fix file content + alert with steps). Makes it trivial for user to get the commands from the systray itself. 2026-06-28 14:50:09 -04:00
Natalie
a22fef2804 feat(whatsapp-redroid): add "Copy Redroid Mesh Fix to Clipboard" menu item to tray. Reads the committed fix file (or fallback) and pbcopies it + alerts user with steps. Now user can click the 📲 tray itself to get the exact net up + DO console commands without needing the file or prior clipboard. Includes SSH Path and Last error items too. 2026-06-28 14:49:49 -04:00
Natalie
44aea7ec02 feat(whatsapp-redroid): add SSH Path menu item to tray (shows -J yuzu or direct wg based on local wg1 detection). Helps user see why jump is used per current net status (no wg1 on plum). 2026-06-28 14:47:57 -04:00
Natalie
dba18e5985 docs(whatsapp-redroid): add redroid-mesh-access-fix.txt with copy-paste ready steps for net up + DO web console ufw/sshd fix (so tray jump or direct succeeds). Clipboard also populated. 2026-06-28 14:46:15 -04:00
Natalie
3378d0710d feat(broadcast): backend-api + controller + shared refinements from quinn-platform-architect agent (pure Bun.serve no-dep backend, robust dest store with /tmp fallback + atomic, typed surfaces, core delegation, error handling; no hono dep for immediate verifiability)
Scoped to agent's paths. Self-verified per agent's commands (syntax, store, boots).

Per approved plan + multi-agent on main.
2026-06-28 14:44:55 -04:00