Commit graph

133 commits

Author SHA1 Message Date
Natalie
da65901d96 perf(prospector): WORKERS concurrency for rationalize (vertical scale)
Some checks are pending
CI / verify (push) Waiting to run
Matches sweep.py — 64-way client concurrency against vLLM max_num_seqs=128 so
the full 8K-row backward-rationalization runs in ~12min on one H100, no
horizontal fleet needed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 04:16:55 -04:00
Natalie
62288fe48b fix(prospector): burst-aware, 1:1-only extraction (shared lib.py)
Some checks are pending
CI / verify (push) Waiting to run
Real convos aren't clean alternating turns: ~38% of message-runs are bursts
(one sender, up to 132 in a row), and 5 group chats mix senders under
is_from_me=0. New lib.py collapses bursts into turns, excludes group chats
(chat.style=45 only), and yields CLIENT->QUINN decision points with a
per-conversation cap (avoids verbose threads flooding the set). Corrected
corpus: 1623 1:1 work-era conversations, 16095 decision points (8129 at
max_per_handle=20). sweep.py now uses lib + WORKERS for vertical scaling.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 04:03:46 -04:00
Natalie
96f4be6021 feat(prospector): generalize rationalize.py to the full work-era corpus
Some checks are pending
CI / verify (push) Waiting to run
Backward CoT distillation over all swept conversations (context + Quinn's actual
reply -> move + gold-anchored trace), full 10-move taxonomy. Produces the
(context -> trace -> move) LoRA training set labeled by what she really did.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 03:39:37 -04:00
Natalie
d0824d7614 gpu: call the GPU's vLLM directly (drop the unbuilt model-boss coordinator)
Some checks are pending
CI / verify (push) Waiting to run
There is no model-boss coordinator deployed — the on-demand GPU droplet serves
raw vLLM (/v1). So the client now sends a standard OpenAI request with an explicit
model (caller's, else GPU_LLM_MODEL) and drops the coordinator-only x_task/
x_priority routing fields; health probes vLLM's /health (was /ready). Set
GPU_LLM_MODEL to vLLM's --served-model-name when the GPU is provisioned.

(ChatJsonOpts.task/priority are now passed-but-ignored; symbol/env names
ModelBossClient/MODEL_BOSS_URL kept to avoid a sprawling rename — cosmetic cleanup.)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 03:36:09 -04:00
Natalie
3adc3433d6 feat(prospector): add sweep.py — semantic move-classification at scale
Some checks are pending
CI / verify (push) Waiting to run
Classifies work-era chat.db threads (Nov 1 2025+) into the full move taxonomy
(opener/qualify/engage/subhour/address/out_of_area/of/disengage/escalate/skip)
with CoT traces; keeps Quinn's actual reply as gold. Scales via LIMIT to grow
the silver-labeled training set; flags sparse semantic classes (escalate/
photographer) that regex can't find. Work-era corpus: ~1491 inbound handles.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 03:20:12 -04:00
Natalie
7e4dd0252b feat(prospector): add rationalize.py — backward CoT distillation from gold
Some checks are pending
CI / verify (push) Waiting to run
STaR-style: given (client_msg -> Quinn's actual reply), infer the move she ran
+ a one-sentence reasoning trace anchored to her real reply. Produces
(message -> trace -> move) training rows for LoRA-hardening move-classification.
First BBC batch: 19 rows, qualify 8 / engage 3 / disengage 8 -- matches her
real qualify-dominant boundary, not a hand-authored guess.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 02:59:34 -04:00
Natalie
c56f2dfcf6 fix(deploy): target com.uvlava.ct.services + DO managed-PG CA cert
Some checks are pending
CI / verify (push) Waiting to run
SERVER_HOST default → 138.197.120.105 (old lime IP released). Ship DO CA cert
+ NODE_EXTRA_CA_CERTS in the unit (managed PG = self-signed chain → node
SELF_SIGNED_CERT_IN_CHAIN). Box must be a DB trusted-source.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 02:44:18 -04:00
Natalie
9f804285fa test(web): regression guard for hooks-order on loading→data transition
Some checks are pending
CI / verify (push) Waiting to run
Locks the fix in 57e898b. The existing route-mount test mocks usePoll to permanent
loading, so it never renders the data branch and missed the memo-after-early-return
crash. This test flips usePoll loading→data for Dashboard + Calendar and asserts the
re-render doesn't throw. Verified it FAILS on the pre-fix views ("Rendered more hooks
than during the previous render") and passes on the fix.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 02:40:23 -04:00
Natalie
5af9962eef infra: add service.deploy to prospector .infra.yaml
Some checks are pending
CI / verify (push) Waiting to run
Completes the unification — the deploy script ref (deploy/deploy-server.sh)
that the retired app.manifest.yaml carried. (Followup to the deletion in HEAD~1.)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 02:39:23 -04:00
Natalie
dd1d25d8b4 infra: unify on .infra.yaml; retire app.manifest.yaml
Some checks are pending
CI / verify (push) Waiting to run
Single manifest per the infra_manifest convention. Added service.deploy
(deploy/deploy-server.sh); manage-apps now auto-discovers this .infra.yaml and
drives the prospector systemd unit on lime (ssh lime systemctl …) — replacing the
brittle inline-ssh strings the app.manifest.yaml carried.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 02:38:30 -04:00
Natalie
57e898b3f9 fix(web): hoist useMemo above early returns in Dashboard + Calendar (Rules of Hooks)
Some checks are pending
CI / verify (push) Waiting to run
Both views called useMemo AFTER their loading/error early-return guards. While the
backend lacked the data (or the dev proxy was unauthenticated) the views always hit
the early return, so the memos were never reached and nothing crashed. The moment a
populated response arrived, React rendered more hooks than the previous render →
"Rendered more hooks than during the previous render" → the view tree threw and the
panel went blank.

Fix: move every useMemo above the `if (error)` / `if (!data)` guards and make each
null-safe (deps key off `data?.*`). Pure refactor — no behavior change once data is
present. Introduced by the Wave-C perf pass (useMemo on derived rows); it slipped
past typecheck (hook rules aren't typed), the route-mount test (usePoll mocked to
permanent loading → early return, memo never reached), and the build.

Verified live against the running backend: Dashboard renders KPIs + density bars +
insights + actions; Bookings renders its grouped/empty state — neither throws.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 02:38:03 -04:00
Natalie
c2bcd23548 feat(prospector): add mine_cluster.py — labeled message clusters from chat.db
Some checks are pending
CI / verify (push) Waiting to run
Pulls every thread matching a pattern (e.g. BBC / self-offer / lowball) paired
with Quinn's actual next reply = the gold move label. The training substrate for
hardening move-classification on the intent-split cases where prompt rules fail
(paying-prospect -> qualify vs non-client -> disengage). PII under gitignored
.data only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 02:36:20 -04:00
Natalie
407366424a docs(plan): mark design-system migration complete — styles.css retired
Some checks are pending
CI / verify (push) Waiting to run
The PWA unification is done: all remaining views/components/shell migrated off
styles.css to the cocotte design system (commits 5a7e093 + 2512e75). Records the
green gate (301 backend + 17 web tests, typecheck, build) and the separate deploy
effort intentionally left out of scope.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 01:48:02 -04:00
Natalie
19c578bead feat(prospector): add tooling/eval draft-engine bake-off harness
Some checks are pending
CI / verify (push) Waiting to run
Validated OSS (Qwen3.6-27B-AEON-Uncensored) Quinn-voice drafting against the
agent-matcher reply-queue baseline. Four methodology fixes eliminate the early
weaknesses: json_schema strict (0% malformed), canon few-shot (100% on-voice),
current-facts/location-from-context (0 location errors), and classify-move-first
then reply (matcher-level discipline on defensive moves: withhold address,
redirect harvesters+crude to OF). PII stays under gitignored .data/; scripts
only. Claude is the offline judge/advisor, never the runtime generator.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 01:47:56 -04:00
Natalie
2512e7512c test(web): add vitest + RTL harness with 16-route mount coverage
Some checks are pending
CI / verify (push) Waiting to run
jsdom + single-instance styled-components/react dedupe (mirrors vite) so the
ThemeProvider context reaches components; MemoryStorage shim for the theme's
localStorage persistence. App.test.tsx proves every prototype route resolves to a
real lazy-loaded view that mounts on the cocotte theme and renders content (not a
Suspense fallback, no Placeholder), with the data layer stubbed to a loading
state — queried by the semantic <main> region, not a class, since the shell is now
pure styled-components.

17 tests green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 01:47:13 -04:00
Natalie
5a7e093485 refactor(web): retire styles.css — migrate remaining views/components/shell to the cocotte design system
Final Wave A/C step of the PWA unification: the last 14 files rendering against
the legacy global styles.css (~1.1k LOC, 166 classes) are now pure
styled-components on @cocotte/ui-theme luxe-dark tokens — 8 views (Triage,
Detail, Reports, Campaigns, Hosts, IntroThread, Control + the 4-file Queue
cluster), 5 shared components (ActivityFeed, DigestBar, HeldQueue, ModeControl,
PeerRegistry), and the App shell (mac-window/titlebar/nav, incl. the installed-PWA
display-mode chrome drop). Each migration was adversarially parity-reviewed vs
designs/ + the prototype; behavior, data flow, props and DOM structure unchanged.

styles.css deleted; its global reset + body base ported to a themed
createGlobalStyle (ui/global.tsx). The three largest views factor their local
styled blocks into co-located *.styled.ts siblings to hold the 500-LOC cap.

Gate green: 301 backend tests, root+web typecheck, web build (240kB/18 chunks),
zero className remaining across web/src.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 01:46:51 -04:00
Natalie
8b49a48fc3 deploy: build the PWA (vite) too, not just the backend
Some checks are pending
CI / verify (push) Waiting to run
The deploy ships web-dist but never built it; add the web/ vite build to the
build step so a fresh deploy includes the operator PWA. Verified: /prospector
PWA serves at lime:3210/ (title "Prospector").

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 01:17:04 -04:00
Natalie
e963bf9381 fix(db): verify managed-PG TLS with DO CA (CWE-295 remediation)
Some checks are pending
CI / verify (push) Waiting to run
Replace rejectUnauthorized:false (flagged by security review — MITM exposure)
with proper chain verification: PROSPECTOR_DB_CA_CERT points at DO's CA PEM and
the connection runs rejectUnauthorized:true. Without a CA it still fails closed
(strict by default); PROSPECTOR_DB_SSL_REJECT_UNAUTHORIZED=false is an explicit,
audited escape hatch only. CA fetched from the DO /databases/<id>/ca API and
placed at /opt/prospector/do-ca.crt on lime. Verified: prospector connects with
strict TLS + serves on :3210.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 01:04:31 -04:00
Natalie
c11f939691 deploy: rewrite prospector deploy to match the working runtime
Some checks are pending
CI / verify (push) Waiting to run
- env is a dotenv at /opt/prospector/.env (ConfigModule envFilePath), NOT a
  systemd EnvironmentFile (dotenv won't override process.env, so EnvironmentFile
  silently shadowed it); unit has no EnvironmentFile, reads .env from WorkingDir.
- correct PROSPECTOR_DB_* vars (app uses discrete vars, not DATABASE_URL),
  PROSPECTOR_DB_SSL=true, generated service tokens, dep placeholders.
- ship migrations/ + ensure psql-16; apply pending SQL migrations (ledger).
- fail-fast on __SET_ME__ DB creds (the secret step stays external).

Verified: prospector live on lime:3210 (active, schema migrated, / -> 200).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 00:59:59 -04:00
Natalie
420fed8a31 fix(db): TLS without strict chain verify for DO Managed PG
`ssl: true` failed SELF_SIGNED_CERT_IN_CHAIN against DO Managed PG (DO-CA cert
not in the default trust store). Use `ssl: { rejectUnauthorized: false }` when
PROSPECTOR_DB_SSL=true (link is already private — VPC + trusted-source firewall);
opt into strict verify with PROSPECTOR_DB_SSL_REJECT_UNAUTHORIZED=true once a CA
bundle is wired. Verified: prospector connects + serves on lime:3210.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 00:58:47 -04:00
Natalie
f10ebc50b9 deploy: prospector backend to lime (manage-apps manifest + deploy script)
Some checks are pending
CI / verify (push) Waiting to run
- app.manifest.yaml: lime platform (systemd unit prospector, :3210, mesh-only),
  deploy/start/stop/status/logs; registered with manage-apps.
- deploy/deploy-server.sh: build (nest) -> ship dist/ + pkg + PWA -> ensure
  node20 -> npm ci --omit=dev -> fail-fast env -> systemd unit -> restart.
  Verified to lime up to the DB pause: node20 installed, deps shipped, unit
  installed; does NOT start until DATABASE_URL (prospector role on
  lilith-store-pg) is set — that secret step is deliberately external.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 00:31:42 -04:00
Natalie
0120acef26 docs(prospector): add model eval & selection pipeline (Claude-advisor/OSS-worker)
Some checks are pending
CI / verify (push) Waiting to run
Bake-off harness in src/eval/ with Claude as offline labeler/judge/advisor
(never in the serving loop). Per-role scoring (classifier F1, generator
refusal+voice+policy+85% gate, orchestrator tool-call), replay harness to
fix Executor cycle-1's no-batch-replay blocker, researched candidate
roster (de-refused instruct base + Quinn-voice LoRA over heavy RP
fine-tunes). Reuses outcomes.jsonl/gold-turnpairs/RUNNER-POLICY.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 23:42:10 -04:00
Natalie
aa3e6eacda feat(tray): replace executable stub bin (MacOS/Prospector) with featureful dispatcher
The previous dumb stub just execd the applescript. Now the bin (still used as the bundle executable and for double-click) supports CLI features/subcommands while preserving default tray UI behavior:

- no arg / tray / menu: launch tray UI (status item + menu)
- launch / open / app: start services (delegates to launch.sh, matches menu "Open Prospector")
- stop: stop services (matches menu "Stop services")
- help: list features

Updated post-build messaging, tray.applescript header comment, scripts/README.md table, and ./run usage. Tested via TRAY_DEST=/tmp/... build + direct bin help invocation (and full make-tray success).
2026-06-29 23:23:51 -04:00
Natalie
75cb79281c docs(plan): note Wave C react perf subagent completion (019f163d-1685-7541-8a68-6eefb4de78bb, 1708eff) + merge into main (memo on rows, useMemo filters, lazy+Suspense split; main chunk 320kB→237kB) 2026-06-29 22:06:07 -04:00
Natalie
4fbcf4204a perf(web): merge Wave C react perf pass from subagent (1708eff in wave-c-react-perf worktree)
- React.memo on list rows (EventRow, QueueTable badges, Activity/Held/Fleet/Empty/Log rows, etc.)
- useMemo for filters/derived (Stream, Reports, Queue, Calendar, Dashboard)
- Route code-split (lazy + Suspense in App.tsx) cutting main chunk ~320kB → 237kB + chunks
2026-06-29 22:05:46 -04:00
Natalie
adabaf561d docs(plan): note Wave C reviewer subagent completion (019f163d-2215-7bf1-9f37-fdeac4656c86) + fixes integrated (Input primitive, no legacy input/any in reviewed views) 2026-06-29 22:04:33 -04:00
Natalie
353a786b0a feat(web): integrate full MarketsView from completed Wave A subagent (7211039 in markets-ui-migration worktree, ui/ only + prototype/designs/markets.html parity + no legacy classes)
- Copied exact subagent version (387 LOC) using Card/VStack/HStack/Seg/SegButton/Muted/Title/Bars/Button + local viz.
- Verified: typecheck clean, web build success, 301 tests.
- PLAN.md updated with subagent note (worktree, commit, fidelity).
2026-06-29 22:03:20 -04:00
Natalie
1708effd57 perf(web): React.memo on list rows (EventRow, Row, HeldRow, FleetRow, EmptyRow, LogRow, QueueTable + badges), useMemo for filters/derived (Stream/Reports/Queue/Calendar/Dashboard), route code-split (lazy+Suspense in App) to cut main chunk; pure helpers unchanged
Some checks are pending
CI / verify (push) Waiting to run
2026-06-29 22:03:08 -04:00
Natalie
a07f76a405 feat(web): integrate full BackfillView from completed Wave B subagent (050c739 in wave-b-backfill worktree, ui/ only + prototype BACKFILL_COHORTS + Bars progress + createTask runs + LOG + flash parity)
- Overwrote with exact subagent-produced version from isolated worktree (274 LOC).
- Verified: typecheck clean, web build success, 301 tests.
- PLAN.md updated with subagent note (worktree, commit, fidelity details).
2026-06-29 22:02:14 -04:00
Natalie
02a67a56ca chore(web): merge main for Wave C reviewer fixes alignment (perf opts + review combined in worktree) 2026-06-29 22:02:13 -04:00
Natalie
06f25d02c2 feat(web): integrate full AutopilotView from completed Wave B subagent (185253f, ui/ only + real getAutopilot + prototype live states parity)
- Replaced with exact subagent-produced version (127 LOC, StatusDot + state-mapped Pills + eta/at + campaign/leaf/why + ghost Button navigation on handle + 4s poll).
- Verified: typecheck clean, web build success, 301 tests.
- PLAN.md updated with subagent note.
2026-06-29 22:01:10 -04:00
Natalie
7d8262b219 fix(web): remove legacy .input css classes + any casts from new/migrated views; add Input primitive to ui/; tighten VoiceAlignment types (no any); align with PLAN no-old-css, STANDARDS explicit types, Wave C review
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 22:00:35 -04:00
Natalie
a6d77eb7f7 docs(plan): note integration of completed Wave A PastebinView drill subagent (9ad22c5, ui/ port matching prototype + designs) 2026-06-29 21:59:59 -04:00
Natalie
c2cd7e4fa4 docs(plan): note integration of completed Wave B VoiceView subagent (full prototype fidelity) 2026-06-29 21:59:11 -04:00
Natalie
51c9f64241 feat(web): restore/integrate full detailed VoiceView.tsx exactly as produced by completed Wave B subagent (a46fb8d, 356 LOC, full prototype exemplars/pairs/toggles + ui/ only) 2026-06-29 21:58:47 -04:00
Natalie
c802c4596e feat(web): integrate full VoiceView from completed Wave B subagent (a46fb8d) + fix TS in other manual views for clean typecheck
- VoiceView now has full prototype parity (exemplars toggles, pairs before→after, corrections, re-align, metrics, persona rules) using only ui/ primitives + safe data narrow.
- Fixed unused imports, missing React imports, implicit any in Backfill/Autopilot/Markets/Prospects (quick manual slices).
- All gates: typecheck clean, web build, 301 tests.
2026-06-29 21:58:29 -04:00
Natalie
dcea21e27f chore(web): remove unused Placeholder import after full wiring (all 16 real views) 2026-06-29 21:56:57 -04:00
Natalie
96bb17ab89 feat(prospector): complete all waves — serial reads + 9 new ui/ views (Dashboard/Stream/etc) + App wiring + partial migrations + gates
- Serial: 6 thin backend reads (new stream/bookings modules + augments), macsync client reads, api.ts 6 clients + types, wiring.
- Wave A/B: implemented Dashboard, Stream, Voice, Autopilot, Backfill, Calendar, Prospects, Settings, Model (all on ui/ primitives only, real data, prototype parity, navigate/poll); Markets migration to ui/; App.tsx fully wired (16 real, no placeholders).
- Verifs: typecheck, 301 tests, web build (green repeatedly); self-verif + subagent verifs.
- PLAN.md updated with completion note.
- Scoped commits + push attempts (agent-owned, Co-Authored).
2026-06-29 21:56:42 -04:00
Natalie
185253f044 feat(web): implement AutopilotView (Wave B) on cocotte ui + getAutopilot -- web/src/views/AutopilotView.tsx
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 21:54:07 -04:00
Natalie
9ad22c5e6d feat(web): migrate PastebinView to cocotte ui (Wave A drill) -- web/src/views/PastebinView.tsx
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 21:53:37 -04:00
Natalie
a46fb8dfa0 feat(web): implement VoiceView (Wave B) on cocotte ui + getVoiceAlignment
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 21:53:10 -04:00
Natalie
f6e72bf41f feat(prospector): serial core complete — 6 prototype backend reads (stream/bookings + augments for backfill/voice/dashboard/autopilot) + macsync client reads + api.ts clients
- New sliced modules stream/, bookings/ (thin, real macsync + audit/drafts data, tests, READMEs).
- Augments to tasks/corrections/reports for the rest (cohorts, alignment, dashboard KPIs).
- Extended MacsyncClient with listInboundMessages/listCalls/listCalendarEvents.
- Typed web api.ts for all 6 (shapes from services + prototype).
- Wired modules. All gates pass (type, 301 tests, web build).
- Prepares Waves A/B (views now have data).
2026-06-29 21:49:15 -04:00
Natalie
1ff86eff3c chore(forge): update git origin to ct-forge with orgname cocotte and refresh examples/comments
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 21:32:41 -04:00
Natalie
6b22256e29 docs(plan): complete with post-holistic state, annotated open Qs, Wave A units, and accurate snapshot/matrix
Some checks are pending
CI / verify (push) Waiting to run
- Updated done-so-far, status, view matrix, and backend reads list to match as-built (holistic modules + drill views + full api.ts for implemented surface).
- Annotated open questions with code-derived leanings (bookings detection-only, keep split, etc.).
- Added progress note and concrete Wave A units list with gates.
- Verified: tests 299 green, typecheck, web build; only this file staged.
2026-06-29 21:30:54 -04:00
Natalie
9c7774fe10 docs(plan): full rewrite — accurate to current state
Some checks are pending
CI / verify (push) Waiting to run
Clean rewrite resolving stale TODO/done drift from incremental edits. Adds a
"Done so far" commit log (foundation, fleet, primitives, P0 shell), corrects the
status snapshot (serial core done bar api.ts stubs), and consolidates the view
matrix + parallel-attack DAG + as-built cloud fleet into one coherent doc.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 21:25:17 -04:00
Natalie
b523d5ad88 feat(web): P0 shell — grouped 16-route nav + themed placeholders
Some checks are pending
CI / verify (push) Waiting to run
App.tsx: OPERATE/CAMPAIGNS/SYSTEM nav groups mirroring the prototype (16 routes +
prospect/intro/pastebin/autopilot), Outbox badge, label≠key (#/queue, #/calendar).
Every route resolves: built views wired, the 8 new ones render a themed Placeholder
(web/src/ui primitives) until Waves A/B. typecheck + build green, zero console errors.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 21:21:53 -04:00
Natalie
087b6d8820 docs(plan): gap re-analysis — P-1 foundation green, fleet ported
Some checks are pending
CI / verify (push) Waiting to run
Status snapshot refresh: site-themes 0.1.1 shipped (prereq done), styled-components
dedupe fix, web/src/ui primitives committed, typecheck+build green. Cloud section
updated from plan→as-built: infra/ harness ported + offline-verified (ct-forge
clone, cocotte-ci S3-mount shared drive), lights up at Wave A. Next serial-core:
App.tsx 16-route shell + api.ts stubs.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 21:19:18 -04:00
Natalie
1a0fbd94d1 feat(web): cocotte design-system primitives (web/src/ui)
Some checks are pending
CI / verify (push) Waiting to run
styled-components on @cocotte/ui-theme tokens: Card, VStack/HStack, Button (4
variants), Seg/SegButton, Pill, StatusDot, Bars, SectionLabel, Title, Muted,
ErrText, Toast. The serial-core vocabulary that replaces styles.css per view.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 21:17:20 -04:00
Natalie
b000f6dabb fix(infra): clone prospector from ct-forge + add S3-mount shared drive
Some checks are pending
CI / verify (push) Waiting to run
- _git_remote: point the fleet at ct-forge (cocotte_forge_creds.FORGE_IP) with the
  origin's `applications` org path + quinn admin password. Earlier reconstruction
  used GIT_ORG=platform (the monorepo default) — wrong org, right forge. 134/165 are
  the same Forgejo; ct-forge is canonical.
- shared drive: `prime` builds once and writes node_modules tarball + dist to the
  cocotte-ci Spaces bucket; `mount`/`umount` rclone-mount it read-only at /mnt/ci on
  every worker so N testers read one build with no per-worker download.
- node_modules stays local (FUSE/S3 stat-storm anti-pattern) via fetch; the mount is
  for bulk artifacts (dist, fixtures, prebuilt binaries, coverage).

shellcheck clean; help renders.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 21:14:55 -04:00
Natalie
69ca8595c8 feat(infra): port mc's DO test/build fleet harness (Node/TS)
Some checks are pending
CI / verify (push) Waiting to run
Ports magic-civilization's packer golden image + terraform test-fleet + dist
dispatch to prospector, adapted for the Node/TS toolchain. Offload npm ci /
typecheck / vitest / vite build onto disposable DO droplets; zero cost when down.

- infra/packer: ct-golden image (Node 20 + chromium + verdaccio .npmrc + warm
  clone + warmed node_modules)
- infra/terraform/test-fleet: N-worker fleet from newest ct-golden (workers=0 = down),
  cocotte-fleet key, cocotte:dev project, ct-forge origin
- infra/fleet/dist.sh: check/image/prune/up/down/test(sharded vitest)/build/
  preview(→ DO Spaces cocotte-ci)/publish+fetch(node_modules cache by lock hash)
- all secrets from ~/.vault (do_pat_cocotte, cocotte_forge_creds, do-spaces-uvlava),
  ssh ~/.ssh/id_cocotte_fleet — nothing hardcoded

Offline-verified: terraform fmt+validate, packer syntax, shellcheck clean. No spend.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 20:55:18 -04:00