coulomb-social/docs/design-extract-auth.md
tegwick 6fe263444a Extract authenticated coulomb.social design language via designlang
Session probe lands on /vw_pages (Research). Use main designlang extract
with --cookie-file — pack ignores auth. 39 artifacts under
docs/design-extract; tolerate designlang late summary crash when cores exist.
2026-08-09 01:31:00 +02:00

137 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Design extract — authenticated access to coulomb.social
designlang can crawl authenticated pages via Playwright cookies / storage state:
```text
npx designlang … --cookie-file <path>
```
Supported cookie file formats: JSON, Playwright `storageState`, Netscape `cookies.txt`.
## Threat model
| Artefact | Sensitivity | Where it lives |
|----------|-------------|----------------|
| Bubble member password | **High** — full account | OpenBao only (never Git/chat) |
| Browser `storageState` | **High** — session impersonation | Local XDG path, mode `0600`, gitignored |
| designlang output (tokens, screenshots) | Product UI — ok in repo after review | `docs/design-extract/` |
Do **not** paste passwords, cookies, or storage-state JSON into chat, workplans, or commits.
## Preferred flow (interactive session)
Bubble login may involve MFA, email codes, or CAPTCHA. Prefer a **human-attended** headed browser once, then reuse session state for extracts.
### 1. Capture session as your user
```bash
cd ~/coulomb-social
./scripts/capture-auth-state.sh
```
1. A Chromium window opens on `https://coulomb.social`.
2. Log in as **your** member account and navigate until you see the authenticated UI you care about.
3. Return to the terminal and press **Enter**.
4. Session is written to:
```text
~/.config/coulomb-social/auth/storage-state.json # mode 0600
```
### 2. Run the extract
```bash
./scripts/run-design-extract.sh
# or with extra flags:
./scripts/run-design-extract.sh --depth 5 --full
```
Default output: `docs/design-extract/` (safe to commit after review; no secrets).
### 3. Refresh when the session expires
Re-run `./scripts/capture-auth-state.sh`. There is no long-lived cookie vault unless you complete the OpenBao lane below.
## OpenBao custody (password for re-login / automation)
Use when you need **unattended** re-auth (CI, agent loops) without a headed browser.
| Field | Value |
|-------|--------|
| Mount | `tenants` |
| Path | `tenants/binky/coulomb-social/bubble-member` |
| Fields | `EMAIL`, `PASSWORD` |
| Risk | `high` (member account) |
| Tenant | `binky` (Binky Hedgehog = client #1) |
| Workload | `coulomb-social` |
| Bundle | `bubble-member` |
This follows `ops-warden/wiki/playbooks/tenant-secret-onboarding.md`. **Status today:** path and fields are **declared** for this repo; the CCR, policy, OIDC role, and catalog entry are **not yet applied**. Until then, use interactive capture only.
### Founder provision (after CCR is applied)
```bash
# values only in mode-0600 files — never argv or chat
printf '%s' 'you@example.com' > /tmp/cs-email
printf '%s' '…' > /tmp/cs-pass
chmod 600 /tmp/cs-email /tmp/cs-pass
bao login -method=oidc -path=netkingdom # admin / net-kingdom-admins as required
bao kv put tenants/binky/coulomb-social/bubble-member \
EMAIL=@/tmp/cs-email \
PASSWORD=@/tmp/cs-pass
shred -u /tmp/cs-email /tmp/cs-pass
```
### Worker fetch (never print)
```bash
bao login -method=oidc -path=netkingdom role=<lane>-workload-kv-read
bao kv get -field=EMAIL tenants/binky/coulomb-social/bubble-member > ~/.config/coulomb-social/auth/email
bao kv get -field=PASSWORD tenants/binky/coulomb-social/bubble-member > ~/.config/coulomb-social/auth/password
chmod 600 ~/.config/coulomb-social/auth/email ~/.config/coulomb-social/auth/password
```
Automated login-from-password is optional (`./scripts/capture-auth-state.sh --from-password-files`) and only works if bubble accepts simple email/password without interactive MFA.
## Routing (agents)
```bash
warden route find "coulomb.social bubble member login"
```
Until a catalog id exists, treat this as:
| Need | Owner |
|------|--------|
| Member password | OpenBao `tenants/binky/…` (founder provision) |
| Interactive session | You — `scripts/capture-auth-state.sh` |
| SSH / tunnels | ops-warden / ops-bridge (unrelated) |
**Anti-patterns:** message ops-warden for the password; commit `storage-state.json`; put `EMAIL`/`PASSWORD` in `.env` in the repo.
## designlang auth flags (reference)
**Important:** use the **main** `designlang <url>` command, not `designlang pack`.
The `pack` subcommand ignores `--cookie-file` and crawls anonymously.
```bash
# Prefer the wrapper (probes session, applies cookies, correct out dir):
./scripts/run-design-extract.sh
# Or manually:
npx designlang https://coulomb.social \
--cookie-file ~/.config/coulomb-social/auth/storage-state.json \
-o docs/design-extract \
-n coulomb-social \
--wait 5000 \
--depth 2 \
--interactions
```
Bubble reuses the same `coulomb_*` cookie **names** for guests and members.
A real member session is verified by landing on an app route (e.g. `/vw_pages`)
after load, not by cookie count.
Chrome extension path (optional): log in in desktop Chrome, use designlangs extension for a one-click handoff if you prefer not to use Playwright capture.