.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>
- 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
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>
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>
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>
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>
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>
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>
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>
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>
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.
.
- 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.
- 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.
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.
.
- 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>
- 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.
- 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.
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.
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.
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).
- 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.
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).
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>
- Caddy serving, auto LE attempts logged (will succeed post 1.1 delegation).
- STATE.md updated with progress.
- Verdaccio backup already live + verified.
- 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).